📄 fsdmgrp.h
字号:
* This internal structure keeps track of all information on an FSD.
*/
struct _FSD {
FSD_DLINK dlFSD; // link in global FSD list
HMODULE hFSD; // module handle to FSD (given to us by DEVICE.EXE)
HANDLE hDsk;
SIGFIELD
PFNMOUNTDISK pfnMountDisk; // address of the FSD's FSD_MountDisk export
PFNUNMOUNTDISK pfnUnmountDisk; // address of the FSD's FSD_UnmountDisk export
PFNHOOKVOLUME pfnHookVolume; // address of the FILTER's FSD_HookVolume export
PFNUNHOOKVOLUME pfnUnhookVolume; // address of the FILTER's FSD_UnhookVolume export
PFNFORMATVOLUME pfnFormatVolume;
DWORD dwFlags;
TCHAR szFileSysName[32];
TCHAR szRegKey[MAX_PATH];
TCHAR szReserved[MAX_PATH];
PREFRESHVOLUME pRefreshVolume;
PREADFILESCATTER pReadFileScatter;
PWRITEFILEGATHER pWriteFileGather;
PFNGETVOLUMEINFO pGetVolumeInfo;
PFNAPI apfnAFS[NUM_AFS_APIS];
PFNAPI apfnFile[NUM_FILE_APIS];
PFNAPI apfnFind[NUM_FIND_APIS];
WCHAR wsFSD[MAX_PATH]; // FSD's entry-point prefix
};
typedef struct _FSDINITDATA {
HANDLE hFSD;
HANDLE hDsk;
HANDLE hPartition;
HANDLE hActivityEvent;
PDEVICEIOCONTROL pIoControl;
DWORD dwFlags;
TCHAR szRegKey[MAX_PATH]; // Max Profile Name Size
TCHAR szFileSysName[32]; // Filesys Name Syse
TCHAR szDiskName[MAX_PATH];
PDSK pNextDisk;
BOOL bFormat;
PSTORE pStore;
PPARTITION pPartition;
} FSDINITDATA, *PFSDINITDATA;
#define MAX_FSD_NAME_SIZE 128
#define MAX_ENTRYPOINT_NAME_SIZE 32
#define AFS_FROM_MOUNT_FLAGS(flags) (((flags) >> 16) & 0xFFFF)
/* INIT.C globals
*/
extern HINSTANCE hDLL; // module handle of this DLL
extern HANDLE hAFSAPI;
extern HANDLE hFileAPI;
extern HANDLE hFindAPI;
extern FSD_DLINK dlFSDList; // global FSD list
extern VOL_DLINK dlVOLList; // global VOL list
extern CRITICAL_SECTION csFSD; // global CS for this DLL
extern HANDLE g_hResumeEvent; // global event indicating that we have resmumed the device
#ifdef DEBUG
// under debug builds, output a debug message when there is contention over the FSDMgr
// critical section and block until the cs is available
#define LockFSDMgr() \
if (!TryEnterCriticalSection(&csFSD)) { \
DEBUGMSG(ZONE_ERRORS, (TEXT("FSDMGR!LockFSDMgr: contention over csFSD!\r\n"))); \
EnterCriticalSection(&csFSD); \
}
#else
// under retail builds, just take the cs
#define LockFSDMgr() EnterCriticalSection(&csFSD);
#endif
#define UnlockFSDMgr() LeaveCriticalSection(&csFSD);
/* INIT.C functions (interfaces exported by FSDMGR.DLL to DEVICE.EXE)
*/
PDSK FSDLoad( FSDINITDATA *pInitData);
DWORD Init(DWORD dwContext);
DWORD Deinit();
PDSK InitEx(FSDINITDATA *pInitData);
int DeinitEx(PDSK pDsk);
/* ALLOC.C functions
*/
PFSD AllocFSD(HMODULE hFSD, HANDLE hDsk);
BOOL DeallocFSD(PFSD pFSD);
PDSK AllocDisk(PFSD pFSD, PCWSTR pwsDsk, HANDLE hDsk, PDEVICEIOCONTROL pIoControl);
void MarkDisk(PDSK pDsk, DWORD dwFlags);
void UnmarkDisk(PDSK pDsk, DWORD dwFlags);
BOOL DeallocDisk(PDSK pDsk);
PVOL AllocVolume(PDSK pDsk, DWORD dwVolData);
BOOL DeallocVolume(PVOL pVol);
BOOL DeallocVolumeHandles(PVOL pVol);
HANDLE AllocFSDHandle(PVOL pVol, HANDLE hProc, HANDLE hNotify, DWORD dwHdlData, DWORD dwFlags);
void DeallocFSDHandle(PHDL pHdl);
/* APIS.C functions
*/
#undef FSDAPI
#define FSDAPI FSDMGR
#include <fsdmgr.h> // leverage the prototypes in fsdmgr.h to declare our functions
// FSDMGR doesn't expose all possible (past and present) file system entry points, but it does
// intercept some of them, so we have to privately declare those here.
BOOL FSDMGR_CloseAllFiles(HVOL hVol, HANDLE hProc);
/* MISC.C functions
*/
void InitList(PDLINK pdl);
BOOL IsListEmpty(PDLINK pdl);
void AddListItem(PDLINK pdlIns, PDLINK pdlNew);
void RemoveListItem(PDLINK pdl);
BOOL CompareFSDs(HMODULE hFSD1, HMODULE hFSD2);
FARPROC GetFSDProcAddress(PFSD pFSD, PCWSTR pwsBaseFunc);
BOOL GetFSDProcArray(PFSD pFSD, PFNAPI *apfnFuncs, CONST PFNAPI *apfnStubs, CONST PCWSTR *apwsBaseFuncs, int cFuncs);
int GetAFSName(int iAFS, PWSTR pwsAFS, int cchMax);
BOOL FsdGetRegistryValue(HKEY hKey, PCTSTR szValueName, PDWORD pdwValue);
BOOL FsdGetRegistryString( HKEY hKey, PCTSTR szValueName, PTSTR szValue, DWORD dwSize);
int FsdStringFromGuid(GUID *pGuid, LPTSTR pszBuf);
BOOL FsdGuidFromString(LPCTSTR pszGuid,GUID *pGuid);
BOOL FsdLoadFlag(HKEY hKey, const TCHAR * szValueName, PDWORD pdwFlag, DWORD dwSet);
DWORD FsdRegOpenKey(const TCHAR *szSubKey, HKEY *phKey);
DWORD FsdRegCloseKey(HKEY hKey);
DWORD FsdRegOpenSubKey(HKEY hKeyRoot, const TCHAR *szSubKey, HKEY *phKey);
DWORD FsdRegEnumKey(HKEY hKey, DWORD dwIndex, LPTSTR lpName, DWORD *lpcbName);
FARPROC FsdGetProcAddress(HMODULE hModule, LPCWSTR lpProcName);
/* SERV.C functions
*/
DWORD FSDMGR_GetDiskInfo(HDSK hDsk, PFDI pfdi);
DWORD FSDMGR_ReadDisk(HDSK hDsk, DWORD dwSector, DWORD cSectors, PBYTE pBuffer, DWORD cbBuffer);
DWORD FSDMGR_WriteDisk(HDSK hDsk, DWORD dwSector, DWORD cSectors, PBYTE pBuffer, DWORD cbBuffer);
DWORD FSDMGR_ReadDiskEx(PFSGI pfsgi, PFSGR pfsgr);
DWORD FSDMGR_WriteDiskEx(PFSGI pfsgi, PFSGR pfsgr);
PVOL FSDMGR_RegisterVolume(HDSK hDsk, PWSTR pwsName, PVOLUME pVolume);
int FSDMGR_GetVolumeName(PVOL pVol, PWSTR pwsName, int cchMax);
void FSDMGR_DeregisterVolume(PVOL pVol);
HANDLE FSDMGR_CreateFileHandle(PVOL pVol, HANDLE hProc, PFILE pFile);
HANDLE FSDMGR_CreateSearchHandle(PVOL pVol, HANDLE hProc, PSEARCH pSearch);
HANDLE FSDMGR_FindFirstChangeNotificationW(PVOL pVol, HANDLE hProc, LPCWSTR lpPathName, BOOL bWatchSubtree, DWORD dwNotifyFilter);
//HSTORE FSDMGR_DeviceToStore(HANDLE hDisk);
typedef DWORD (*PFN_FORMATVOLUME)(HANDLE, LPVOID);
typedef DWORD (*PFN_SCANVOLUME)(HANDLE, LPVOID);
/* STUBS.C functions
*/
#undef FSDAPI
#define FSDAPI FSDMGRStub
#include <fsdmgr.h> // leverage the prototypes in fsdmgr.h to declare our stubs
#undef FSDAPI
#define FSDAPI FILTER
#include <fsdmgr.h> // leverage the prototypes in fsdmgr.h to declare our filter functions
#ifdef __cplusplus
}
#endif /* __cplusplus */
/* TABLES.C globals
*/
#if defined(UNDER_CE) && defined(DEBUG)
extern DBGPARAM dpCurSettings;
#endif
extern CONST PCWSTR apwsAFSAPIs[NUM_AFS_APIS];
extern CONST PFNAPI apfnAFSAPIs[NUM_AFS_APIS];
extern CONST PFNAPI apfnAFSStubs[NUM_AFS_APIS];
extern CONST DWORD asigAFSAPIs[NUM_AFS_APIS];
extern CONST PCWSTR apwsFileAPIs[NUM_FILE_APIS];
extern CONST PFNAPI apfnFileAPIs[NUM_FILE_APIS];
extern CONST PFNAPI apfnFileStubs[NUM_FILE_APIS];
extern CONST DWORD asigFileAPIs[NUM_FILE_APIS];
extern CONST PCWSTR apwsFindAPIs[NUM_FIND_APIS];
extern CONST PFNAPI apfnFindAPIs[NUM_FIND_APIS];
extern CONST PFNAPI apfnFindStubs[NUM_FIND_APIS];
extern CONST DWORD asigFindAPIs[NUM_FIND_APIS];
/* Last but not least, DEBUG-only stuff
*/
#define DEBUGMSGW DEBUGMSG
#ifndef ASSERT
#define ASSERT(c) DEBUGCHK(c)
#endif
#if defined(XREF_CPP_FILE)
#define ERRFALSE(exp)
#elif !defined(ERRFALSE)
// This macro is used to trigger a compile error if exp is false.
// If exp is false, i.e. 0, then the array is declared with size 0, triggering a compile error.
// If exp is true, the array is declared correctly.
// There is no actual array however. The declaration is extern and the array is never actually referenced.
#define ERRFALSE(exp) extern char __ERRXX[(exp)!=0]
#endif
#ifdef DEBUG
#ifdef UNDER_CE
#define OWNCRITICALSECTION(cs) ((cs)->LockCount > 0 && (DWORD)(cs)->OwnerThread == GetCurrentThreadId())
#else
#define OWNCRITICALSECTION(cs) TRUE #endif
#else // !DEBUG
#define OWNCRITICALSECTION(cs) TRUE
#endif // !DEBUG
#define DBGTEXT(fmt) TEXT(fmt)
#define DBGTEXTW(fmt) TEXTW(fmt)
#define RETAILMSGBREAK(cond,msg) if (cond) {RETAILMSG(TRUE,msg); DebugBreak();} else
#if 0
typedef struct _IOREQ
{
HANDLE hThread;
HANDLE hProcess;
DWORD dwCode;
DWORD dwCount;
PVOL pVol;
PHDL pHdl;
DWORD dwFlags;
DWORD dwStatus;
struct _IOREQ *pPrev;
struct _IOREQ *pNext;
} IOREQ, * PIOREQ;
#endif
typedef struct _FSDLOADLIST
{
TCHAR szPath[MAX_PATH];
TCHAR szName[MAX_PATH];
DWORD dwOrder;
struct _FSDLOADLIST *pNext;
} FSDLOADLIST, *PFSDLOADLIST;
#define LOAD_FLAG_SYNC 0x00000001
#define LOAD_FLAG_ASYNC 0x00000002
PFSDLOADLIST LoadFSDList( HKEY hKey, DWORD dwFlags, TCHAR *szPath = NULL, PFSDLOADLIST pExisting = NULL, BOOL bReverse = FALSE);
PDSK HookFilters(PDSK pDsk, PFSD pFSD);
#ifndef UNDER_CE
// NT definitions of CE functions
#define LoadDriver(a) LoadLibrary(a)
#define CreateAPIHandle(a,b) (HANDLE)(b)
#define SetHandleOwner(a,b)
#endif
#endif // FSDMGRP_H
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -