⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fsdmgrp.h

📁 WinCE5.0部分核心源码
💻 H
📖 第 1 页 / 共 2 页
字号:
 *  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 + -