165 lines
5.3 KiB
C
165 lines
5.3 KiB
C
#pragma once
|
|
|
|
#include <Windows.h>
|
|
|
|
#define RING_MOUNT_OS "C:"
|
|
#define RING_MOUNT_APPDATA "Y:"
|
|
#define RING_MOUNT_RECOVERY "Z:"
|
|
#define RING_MOUNT_SYSTEM "S:"
|
|
#define RING_MOUNT_ORIGINAL "O:"
|
|
#define RING_MOUNT_PATCH "P:"
|
|
#define RING_MOUNT_OS_UPDATE "W:"
|
|
#define RING_MOUNT_OS_DEFAULT_DRVIERS "V:"
|
|
#define RING_MOUNT_EXTEND_VOL "W:"
|
|
#define RING_MOUNT_EXTEND2_VOL "V:"
|
|
#define RING_MOUNT_GAME "X:"
|
|
#define RING_MOUNT_APM "I:"
|
|
#define RING_MOUNT_AM_LOG "L:"
|
|
#define RING_MOUNT_DVD "Q:"
|
|
#define RING_MOUNT_DEV "Z:"
|
|
|
|
typedef enum {
|
|
MICE_FS_NS_WIN32,
|
|
MICE_FS_NS_DEVICE,
|
|
} MICE_FS_NAMESPACE;
|
|
|
|
typedef struct MICE_FS_PATH MICE_FS_PATH, *PMICE_FS_PATH;
|
|
struct MICE_FS_PATH {
|
|
MICE_FS_NAMESPACE m_dwNamespace;
|
|
LPCSTR m_lpComponents;
|
|
};
|
|
|
|
typedef struct MICE_FS_LAYER MICE_FS_LAYER, *PMICE_FS_LAYER;
|
|
struct MICE_FS_LAYER {
|
|
LPCSTR m_lpMountPoint;
|
|
LPCSTR m_lpTargetPath;
|
|
PMICE_FS_LAYER m_Next;
|
|
};
|
|
|
|
typedef struct {
|
|
LPSTR m_lpPath;
|
|
DWORD m_dwPath;
|
|
DWORD m_dwComponentStart;
|
|
DWORD m_dwWorkPtr;
|
|
CHAR m_cSave;
|
|
} MICE_FS_PATH_TOK, *PMICE_FS_PATH_TOK;
|
|
|
|
/**
|
|
* @brief Initialise the Mice filesystem emulation stack
|
|
*/
|
|
BOOL MiceFSInit(VOID);
|
|
|
|
/**
|
|
* @brief Get the currently emulated CWD
|
|
*/
|
|
LPCSTR MiceFSGetCwd(VOID);
|
|
/**
|
|
* @brief Set the currently emulated CWD
|
|
*
|
|
* @param lpNewCwd New CWD
|
|
*/
|
|
VOID MiceFSSetCwd(LPCSTR lpNewCwd);
|
|
|
|
/**
|
|
* @brief Add a new layer to the emulation stack
|
|
* Layers added later will be used preferentially.
|
|
*
|
|
* @param lpMountPoint Virtual path to mount this layer at
|
|
* @param lpTargetPath Real location that will serve files for this layer
|
|
* @return BOOL Success. Use GetLastError to identify the cause of failiure.
|
|
*/
|
|
BOOL MiceFSAddLayer(_In_z_ LPCSTR lpMountPoint, _In_z_ LPCSTR lpTargetPath);
|
|
|
|
/**
|
|
* @brief Add layers for all drive letters backed by ".\mice\dev\[letter]"
|
|
* If used, this should be the first set of layers added, to act as a fallback
|
|
*
|
|
* @return BOOL Success. As this function adds 26 layers, and failiure could occur at any time,
|
|
* failiure of this function should be considered a fatal failiure and MiceFS should be considered
|
|
* to be in an indeterminate state.
|
|
*/
|
|
BOOL MiceFSAddDevLayers(VOID);
|
|
|
|
/**
|
|
* @brief Add layers for all RingEdge system partitions.
|
|
*
|
|
* @return BOOL Success. See MiceFSAddDevLayers rearding when this is FALSE.
|
|
*/
|
|
BOOL MiceFSAddRingedgeLayers(BOOL bIsOsupdate);
|
|
|
|
/**
|
|
* @brief Tokenise a path, returning each individual token (think, strtok)
|
|
*
|
|
* The first call to this function should provide lpPath and dwPath to initialise the operation.
|
|
* Subsequence calls should provide NULL and 0 respectively. The "MiceFSPathTokNextA" macro aids in
|
|
* this.
|
|
*
|
|
* Empty strings are defined as having no components, and as such NULL will be returned on the first
|
|
* call.
|
|
*
|
|
* Multiple slashes in a row will be combined, rather than returning an empty component.
|
|
*
|
|
* Special handling is applied for paths starting with slashes. The first component returned will be
|
|
* a 0-length string. This is the only time this function returns 0-length strings. The second
|
|
* component will contain all but the first slash.
|
|
* That is, \\.\demo will return "", "\.", "demo", NULL. Tihis is done to allow handling of path
|
|
* namespaces.
|
|
*
|
|
* @param lpPath Path to split. This buffer will be modified!
|
|
* @param dwPath Length of lpPath including the null termination
|
|
* @param lpWork Pointer to a work structure to identify this path operation
|
|
* @return LPSTR The path component, or NULL when the operation is completed.
|
|
*/
|
|
LPSTR MiceFSPathTokA(_In_reads_opt_z_(dwPath) LPSTR lpPath, _In_ DWORD dwPath,
|
|
_In_ PMICE_FS_PATH_TOK lpWork);
|
|
#define MiceFSPathTokNextA(lpWork) MiceFSPathTokA(NULL, 0, lpWork)
|
|
|
|
/**
|
|
* @brief Return the full path in a tokenising buffer, starting with the current component
|
|
*
|
|
* @param lpWork Work buffer
|
|
* @param lpPath Destination buffer
|
|
* @param dwPath Size of lpPath
|
|
*/
|
|
VOID MiceFSPathTokRestA(_In_ PMICE_FS_PATH_TOK lpWork, _Out_writes_z_(dwPath) LPSTR lpPath,
|
|
_In_ DWORD dwPath);
|
|
|
|
/**
|
|
* @brief Attempt to a path against a prefix
|
|
*
|
|
* @param lpPath The path to test
|
|
* @param lpPrefix The prefix to match against
|
|
* @param lpTail (Optional) Received the tail of lpPath after lpPrefix
|
|
* @param dwTail Size of lptail
|
|
*/
|
|
BOOL MiceFSMatchPathA(_In_z_ LPCSTR lpPath, _In_z_ LPCSTR lpPrefix,
|
|
_Out_writes_z_(dwTail) LPSTR lpTail, _In_ DWORD dwTail);
|
|
|
|
/**
|
|
* @brief Redirect a virtual path to a real path using Mice FS layers.
|
|
*
|
|
* The first layer to match with an existing file on disk will be selected.
|
|
*
|
|
* If redirection does not occur, the value of pszRedirected is unchanged.
|
|
*
|
|
* It is safe to (lpFilename, &lpFilename) as an argument pair.
|
|
*
|
|
* @param lpFileName Virtual filename
|
|
* @param pszRedirected Redirected real filename
|
|
* @return BOOL If redirection occured
|
|
*/
|
|
BOOL MiceFSRedirectPathA(_In_z_ LPCSTR lpFileName, _Out_opt_ LPCSTR* pszRedirected);
|
|
/**
|
|
* @brief Wide variant of MiceFSRedirectPathA
|
|
*/
|
|
BOOL MiceFSRedirectPathW(_In_z_ LPCWSTR lpFileName, _Out_opt_ LPCWSTR* pszRedirected);
|
|
|
|
/**
|
|
* @brief Output a list of all filesystem layers to stdout
|
|
*/
|
|
void MiceFSDebugPrintLayers(void);
|
|
/**
|
|
* @brief Perform MiceFSRedirectPathA, with trace logging to stdout
|
|
*/
|
|
BOOL MiceFSDebugTraceRedirectPathA(_In_z_ LPCSTR lpFileName, _Out_opt_ LPCSTR* pszRedirected);
|