📄 udfs.h
字号:
FILE_HANDLE_INFO* m_pFileHandleList;
CRITICAL_SECTION m_csListAccess;
LONG m_State;
LONG m_fRegisterLabel;
//
// Pointer to File System Object (CDFS/UDFS/CDDA)
//
BYTE m_bFileSystemType;
CFileSystem* m_pFileSystem;
CReadOnlyFileSystemDriver *m_pNextDriver;
TCHAR m_szAFSName[MAX_PATH];
// To Handle Mount Notifications
TCHAR m_szMountName[MAX_PATH];
GUID m_MountGuid;
BOOL m_bMounted;
HANDLE m_hMounting;
public:
// Handle to our custom heap
HANDLE m_hHeap;
CReadOnlyFileSystemDriver() :
m_State(StateClean),
m_pFileHandleList(NULL),
m_cFindHandleListSize(0),
m_ppFindHandles(NULL),
m_fRegisterLabel(FALSE),
m_pFileSystem(NULL),
m_pNextDriver(NULL),
m_hTestUnitThread(NULL),
m_hWakeUpEvent(NULL),
m_bFileSystemType(0),
m_bMounted(FALSE),
m_hHeap(NULL)
{
memset( &m_RootDirectoryPointer, 0, sizeof(DIRECTORY_ENTRY));
memset( &m_MountGuid, 0, sizeof(GUID));
wcscpy( m_szMountName, L"");
wcscpy( m_szAFSName, L"");
InitializeCriticalSection(&m_csListAccess);
m_hMounting = CreateMutex(NULL, FALSE, NULL);
}
virtual ~CReadOnlyFileSystemDriver()
{
if (m_pFileSystem)
delete m_pFileSystem;
if (m_hWakeUpEvent)
CloseHandle(m_hWakeUpEvent);
if (m_hTestUnitThread)
CloseHandle(m_hTestUnitThread);
if(g_bDestroyOnUnmount) {
if(m_hHeap) {
HeapDestroy( m_hHeap);
}
}
else {
FILE_HANDLE_INFO *pTempFileHandle;
while (m_pFileHandleList) {
pTempFileHandle = m_pFileHandleList->pNext;
UDFSFree(m_hHeap, m_pFileHandleList);
m_pFileHandleList = pTempFileHandle;
}
if (m_ppFindHandles) {
while( m_cFindHandleListSize) {
UDFSFree(m_hHeap, m_ppFindHandles[--m_cFindHandleListSize]);
}
UDFSFree(m_hHeap, m_ppFindHandles);
}
}
DeleteCriticalSection(&m_csListAccess);
if(m_hMounting) {
CloseHandle(m_hMounting);
}
}
BOOL Initialize(HDSK hDsk);
BOOL RegisterVolume(CReadOnlyFileSystemDriver *pDrv, BOOL bMountLabel = TRUE);
void DeregisterVolume(CReadOnlyFileSystemDriver *pDrv);
BOOL Mount();
BOOL Unmount();
void MediaCheckInside(CReadOnlyFileSystemDriver* pDrv);
void SaveRootName( PCHAR pName,BOOL UniCode );
static void MediaChanged(CReadOnlyFileSystemDriver* pDrv, BOOL bUnitReady);
inline BOOL IsEqualDisk(HDSK hDsk)
{
return(m_hDsk == hDsk);
}
inline CReadOnlyFileSystemDriver *GetNextDriver()
{
return m_pNextDriver;
}
public:
void Clean();
void CleanRecurse(PDIRECTORY_ENTRY pDir);
BOOL IsHandleDirty(PFILE_HANDLE_INFO pHandle);
BOOL ReadDisk( ULONG Sector, PBYTE pBuffer, DWORD cbBuffer);
BOOL Read( DWORD dwSector, DWORD dwStartSectorOffset, ULONG nBytesToRead, PBYTE pBuffer, DWORD * pNumBytesRead, LPOVERLAPPED lpOverlapped);
BOOL UDFSDeviceIoControl(DWORD dwIoControlCode,LPVOID lpInBuffer, DWORD nInBufferSize, LPVOID lpOutBuffer,
DWORD nOutBufferSize, LPDWORD lpBytesReturned, LPOVERLAPPED lpOverlapped);
BOOL FindFile(LPCWSTR pFileName, PPDIRECTORY_ENTRY ppDirEntry);
BOOL FindFileRecurse(LPWSTR pFileName, LPWSTR pFullPath, PDIRECTORY_ENTRY pIntialDirectoryEntry, PPDIRECTORY_ENTRY ppFileInfo);
void CopyDirEntryToWin32FindStruct(PWIN32_FIND_DATAW pfd, PDIRECTORY_ENTRY pDirEntry);
public:
HANDLE ROFS_CreateFile(HANDLE hProc,PCWSTR pwsFileName, DWORD dwAccess, DWORD dwShareMode,
LPSECURITY_ATTRIBUTES pSecurityAttributes, DWORD dwCreate, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile);
BOOL ROFS_CloseFileHandle( PFILE_HANDLE_INFO pfh);
HANDLE ROFS_FindFirstFile( HANDLE hProc, PCWSTR pwsFileSpec, PWIN32_FIND_DATAW pfd);
BOOL ROFS_FindNextFile( PFIND_HANDLE_INFO psfr, PWIN32_FIND_DATAW pfd);
BOOL ROFS_FindClose( PFIND_HANDLE_INFO psfr);
DWORD ROFS_GetFileAttributes( PCWSTR pwsFileName);
BOOL ROFS_ReadFile( PFILE_HANDLE_INFO pfh, LPVOID buffer, DWORD nBytesToRead, DWORD * pNumBytesRead, OVERLAPPED * pOverlapped);
BOOL ROFS_ReadFileWithSeek( PFILE_HANDLE_INFO pfh, LPVOID buffer, DWORD nBytesToRead, LPDWORD lpNumBytesRead,
LPOVERLAPPED lpOverlapped, DWORD dwLowOffset, DWORD dwHighOffset);
DWORD ROFS_SetFilePointer( PFILE_HANDLE_INFO pfh, LONG lDistanceToMove, PLONG lpDistanceToMoveHigh, DWORD dwMoveMethod);
DWORD ROFS_GetFileSize( PFILE_HANDLE_INFO pfh, PDWORD pFileSizeHigh);
BOOL ROFS_GetFileTime( PFILE_HANDLE_INFO pfh, LPFILETIME pCreation, LPFILETIME pLastAccess, LPFILETIME pLastWrite);
BOOL ROFS_GetFileInformationByHandle( PFILE_HANDLE_INFO pfh, LPBY_HANDLE_FILE_INFORMATION pFileInfo);
BOOL ROFS_RegisterFileSystemNotification(HWND hWnd) { return FALSE; }
BOOL ROFS_DeviceIoControl(PFILE_HANDLE_INFO pfh, DWORD dwIoControlCode, LPVOID lpInBuf, DWORD nInBufSize, LPVOID lpOutBuf, DWORD nOutBufSize, LPDWORD lpBytesReturned, LPOVERLAPPED lpOverlapped);
BOOL ROFS_GetDiskFreeSpace( PDWORD pSectorsPerCluster, PDWORD pBytesPerSector, PDWORD pFreeClusters, PDWORD pClusters);
};
typedef struct tagUDFSDRIVERLIST
{
PUDFSDRIVER pUDFS;
HDSK hDsk;
struct tagUDFSDRIVERLIST* pUDFSNext;
} UDFSDRIVERLIST, *PUDFSDRIVERLIST;
#ifdef __cplusplus
extern "C" {
#endif
//
// API Methods
//
BOOL ROFS_CreateDirectory( PUDFSDRIVER pVol, PCWSTR pwsPathName, LPSECURITY_ATTRIBUTES pSecurityAttributes);
BOOL ROFS_RemoveDirectory( PUDFSDRIVER pVol, PCWSTR pwsPathName);
BOOL ROFS_SetFileAttributes( PUDFSDRIVER pVol, PCWSTR pwsFileName, DWORD dwAttributes);
DWORD ROFS_GetFileAttributes( PUDFSDRIVER pDrv, PCWSTR pwsFileName);
HANDLE ROFS_CreateFile(
PUDFSDRIVER pVol,
HANDLE hProc,
PCWSTR pwsFileName,
DWORD dwAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES pSecurityAttributes,
DWORD dwCreate,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile);
BOOL ROFS_DeleteFile( PUDFSDRIVER pVol, PCWSTR pwsFileName);
BOOL ROFS_MoveFile( PUDFSDRIVER pVol, PCWSTR pwsOldFileName, PCWSTR pwsNewFileName);
BOOL ROFS_RegisterFileSystemNotification( PUDFSDRIVER pVol, HWND hWnd);
HANDLE ROFS_FindFirstFile( PUDFSDRIVER pvol, HANDLE hProc, PCWSTR pwsFileSpec, PWIN32_FIND_DATAW pfd);
BOOL ROFS_RegisterFileSystemNotification( PUDFSDRIVER pVol, HWND hWnd);
BOOL ROFS_RegisterFileSystemFunction( PUDFSDRIVER pVol, SHELLFILECHANGEFUNC_t pShellFunc);
BOOL ROFS_OidGetInfo( PUDFSDRIVER pvol, CEOID oid, CEOIDINFO *poi);
BOOL ROFS_DeleteAndRenameFile( PUDFSDRIVER pVol, PCWSTR pwsOldFile, PCWSTR pwsNewFile);
BOOL ROFS_CloseAllFileHandles( PUDFSDRIVER pVol, HANDLE hProc);
BOOL ROFS_GetDiskFreeSpace( PUDFSDRIVER pVol, PCWSTR pwsPathName, PDWORD pSectorsPerCluster, PDWORD pBytesPerSector, PDWORD pFreeClusters, PDWORD pClusters);
void ROFS_Notify( PUDFSDRIVER pVol, DWORD dwFlags);
//
// File API Methods
//
BOOL ROFS_CloseFileHandle( PFILE_HANDLE_INFO pfh);
BOOL ROFS_ReadFile( PFILE_HANDLE_INFO pfh, LPVOID buffer, DWORD nBytesToRead, DWORD * pNumBytesRead, OVERLAPPED * pOverlapped);
BOOL ROFS_WriteFile( PFILE_HANDLE_INFO pfh, LPCVOID buffer, DWORD nBytesToWrite, LPDWORD pNumBytesWritten, LPOVERLAPPED pOverlapped);
DWORD ROFS_GetFileSize( PFILE_HANDLE_INFO pfh, PDWORD pFileSizeHigh);
DWORD ROFS_SetFilePointer( PFILE_HANDLE_INFO pfh, LONG lDistanceToMove, PLONG lpDistanceToMoveHigh, DWORD dwMoveMethod);
BOOL ROFS_GetFileInformationByHandle( PFILE_HANDLE_INFO pfh, LPBY_HANDLE_FILE_INFORMATION pFileInfo);
BOOL ROFS_FlushFileBuffers( PFILE_HANDLE_INFO pfh);
BOOL ROFS_GetFileTime( PFILE_HANDLE_INFO pfh, LPFILETIME pCreation, LPFILETIME pLastAccess, LPFILETIME pLastWrite);
BOOL ROFS_SetFileTime( PFILE_HANDLE_INFO pfh, CONST FILETIME *pCreation, CONST FILETIME *pLastAccess, CONST FILETIME *pLastWrite);
BOOL ROFS_SetEndOfFile( PFILE_HANDLE_INFO pfh);
// DeviceIOControl
BOOL ROFS_ReadFileWithSeek(
PFILE_HANDLE_INFO pfh,
LPVOID buffer,
DWORD nBytesToRead,
LPDWORD lpNumBytesRead,
LPOVERLAPPED lpOverlapped,
DWORD dwLowOffset,
DWORD dwHighOffset);
BOOL ROFS_WriteFileWithSeek(
PFILE_HANDLE_INFO pfh,
LPCVOID buffer,
DWORD nBytesToWrite,
LPDWORD lpNumBytesWritten,
LPOVERLAPPED lpOverlapped,
DWORD dwLowOffset,
DWORD dwHighOffset);
//
// Find API Methods
//
BOOL ROFS_FindClose(PFIND_HANDLE_INFO psfr);
BOOL ROFS_FindNextFile(PFIND_HANDLE_INFO psfr, PWIN32_FIND_DATAW pfd);
BOOL ROFS_DeviceIoControl( PFILE_HANDLE_INFO pfh, DWORD dwIoControlCode, LPVOID lpInBuf, DWORD nInBufSize, LPVOID lpOutBuf,
DWORD nOutBufSize, LPDWORD lpBytesReturned, LPOVERLAPPED lpOverlapped);
BOOL ROFS_GetVolumeInfo(PUDFSDRIVER pVol, CE_VOLUME_INFO_LEVEL InfoLevel, FSD_VOLUME_INFO *pInfo);
BOOL FSD_MountDisk(HDSK hDsk);
BOOL FSD_UnmountDisk(HDSK hdsk);
#ifdef __cplusplus
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -