📄 udfs.h
字号:
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//
// This source code is licensed under Microsoft Shared Source License
// Version 1.0 for Windows CE.
// For a copy of the license visit http://go.microsoft.com/fwlink/?LinkId=3223.
//
//+-------------------------------------------------------------------------
//
//
// File: udfs.h
//
// Contents:
//
// Classes:
//
// Functions:
//
//--------------------------------------------------------------------------
#define WINCEOEM 1
#include <windows.h>
#include <extfile.h>
#include <fsdmgr.h>
#include <cdioctl.h>
#include <dvdioctl.h>
#include <udfsdbg.h>
#include <udfshelper.h>
#include <dbt.h>
#include <storemgr.h>
#include <iso9660.h>
#pragma warning( disable : 4200 )
#include <iso13346.h>
#pragma warning( default : 4200 )
#define FS_MOUNT_POINT_NAME L"CD-ROM"
#define FS_MOUNT_POINT_NAME_LENGTH 6
#define MAX_SECTORS_TO_PROBE 10
const BYTE DIR_HEADER_SIGNATURE[8] = {
0x08,0x11,0x71,0x40,0xB4,0x43,0x52,0x10
};
#define CD_SECTOR_SIZE 2048
#define MAX_CD_READ_SIZE 65536
#define StateClean 0
#define StateDirty 1
#define StateCleaning 2
#define FIND_HANDLE_LIST_START_SIZE 5
#define IS_ANSI_FILENAME 8000
#define FILE_SYSTEM_TYPE_CDFS 1
#define FILE_SYSTEM_TYPE_UDFS 2
#define FILE_SYSTEM_TYPE_CDDA 3
extern CRITICAL_SECTION g_csMain;
extern const SIZE_T g_uHeapInitSize;
extern SIZE_T g_uHeapMaxSize;
extern BOOL g_bDestroyOnUnmount;
typedef struct tagDirectoryEntry
{
WORD cbSize; // Length of the whole structure
WORD fFlags;
DWORD dwDiskLocation;
DWORD dwDiskSize; // Per spec no file > 1 gig
DWORD dwByteOffset;
FILETIME Time;
struct tagDirectoryHeader* pHeader;
struct tagDirectoryEntry* pCacheLocation;
union {
WCHAR szNameW[1];
CHAR szNameA[1];
};
} DIRECTORY_ENTRY, *PDIRECTORY_ENTRY, **PPDIRECTORY_ENTRY;
typedef struct tagDirectoryHeader
{
DWORD cbSize;
BYTE Signature[8];
PDIRECTORY_ENTRY pParent;
LONG dwLockCount;
WCHAR szFullPath[1];
} DIRECTORY_HEADER, *PDIRECTORY_HEADER;
typedef class CReadOnlyFileSystemDriver* PUDFSDRIVER;
typedef struct tagFHI
{
DWORD cbSize;
LONG State;
PUDFSDRIVER pVol;
DWORD dwDiskLocation;
DWORD dwByteOffset;
DWORD dwDiskSize;
DWORD dwFilePointer;
FILETIME Time;
DWORD fFlags;
BOOL fOverlapped;
struct tagFHI* pNext;
struct tagFHI* pPrevious;
} FILE_HANDLE_INFO, *PFILE_HANDLE_INFO, **PPFILE_HANDLE_INFO;
typedef struct tagFindInfo
{
PUDFSDRIVER pVol;
PDIRECTORY_ENTRY pDirectoryEntry;
PDIRECTORY_HEADER pHeader;
LONG State;
WCHAR szFileMask[1];
} FIND_HANDLE_INFO, *PFIND_HANDLE_INFO, **PPFIND_HANDLE_INFO;
//
// We need to make sure that all directory structures are 4 byte aligned
//
#define ALIGNMENT 4
#define ALIGN(x) (((x) + (ALIGNMENT-1)) & ~(ALIGNMENT - 1))
inline PDIRECTORY_ENTRY NextDirectoryEntry(PDIRECTORY_ENTRY pDirEntry)
{
DEBUGCHK(pDirEntry != NULL);
return (PDIRECTORY_ENTRY)
((DWORD)pDirEntry + pDirEntry->cbSize);
}
inline BOOL IsLastDirectoryEntry(PDIRECTORY_ENTRY pDirEntry)
{
return (pDirEntry->cbSize == 0);
}
class CReadOnlyFileSystemDriver;
//
// CFileSystem - serach Media for the File System type.
// - create and init detected File System (CDFS/UDFS/CDDA)
//
// Notes: Probably the best solution would to derive CFileSystem Class
// From CReadOnlyFileSystemDriver. In this case we have only one
// for each CD File System. At the moment we have to mentain two
// objects connected with each other via pointers.
//
//
// TBD: class CFileSystem. public CReadOnlyFileSystemDriver;
//
class CFileSystem
{
protected:
//
// Pointer to the corresponding Driver/Volume object.
//
PUDFSDRIVER m_pDriver;
public:
static BYTE DetectCreateAndInit( PUDFSDRIVER pDrv, PDIRECTORY_ENTRY pRootDirectoryPointer, CFileSystem** ppNewFS);
//
// This fucntion is defined in the derived class
// - CCDFSFileSystem
// - CUDFSFileSystem
// - CCDDAFileSystem
virtual BOOL ReadDirectory( LPWSTR pszFullPath, PDIRECTORY_ENTRY pDirectoryEntry) = 0;
};
class CCDFSFileSystem : public CFileSystem
{
private:
BOOL m_fUnicodeFileSystem;
public:
CCDFSFileSystem( PUDFSDRIVER pDrv, BOOL fUnicodeFileSystem)
{
m_pDriver = pDrv;
m_fUnicodeFileSystem = fUnicodeFileSystem;
}
static BYTE DetectCreateAndInit( PUDFSDRIVER pDrv, PDIRECTORY_ENTRY pRootDirectoryPointer, CFileSystem** ppNewFS);
static BOOL DetectCreateAndInitAtLocation( DWORD dwInitialSector, PUDFSDRIVER pDrv, PDIRECTORY_ENTRY pRootDirectoryPointer, CFileSystem** ppNewFS);
virtual BOOL ReadDirectory( LPWSTR pszFullPath, PDIRECTORY_ENTRY pDirectoryEntry);
};
class CUDFSFileSystem : public CFileSystem
{
private:
DWORD m_dwPartitionStart;
public:
CUDFSFileSystem (PUDFSDRIVER pDrv)
{
m_pDriver = pDrv;
}
static BYTE DetectCreateAndInit( PUDFSDRIVER pDrv, PDIRECTORY_ENTRY pRootDirectoryPointer, CFileSystem** ppNewFS);
virtual BOOL ReadDirectory( LPWSTR pszFullPath, PDIRECTORY_ENTRY pDirectoryEntry);
BOOL CUDFSFileSystem::ResolveFilePosition( DWORD dwDiskLocation, PDIRECTORY_ENTRY pCurrentCacheEntry, PDWORD pdwDiskSize);
};
class CCDDAFileSystem : public CFileSystem
{
private:
CDROM_TOC m_cdtoc;
public:
CCDDAFileSystem(PUDFSDRIVER pDrv, CDROM_TOC cdtoc)
{
m_pDriver = pDrv;
m_cdtoc = cdtoc;
}
static BYTE DetectCreateAndInit( PUDFSDRIVER pDrv, PDIRECTORY_ENTRY pRootDirectoryPointer, CFileSystem** ppNewFS);
virtual BOOL ReadDirectory( LPWSTR pszFullPath, PDIRECTORY_ENTRY pDirectoryEntry);
};
class CReadOnlyFileSystemDriver
{
private:
//
// Root/Volume Name
//
TCHAR m_RootName[33];
//
//
HVOL m_hVolume;
HDSK m_hDsk;
// Following is for disk removal detection
HANDLE m_hTestUnitThread;
HANDLE m_hWakeUpEvent;
BOOL m_fUnitReady;
//
// Cached list of directory entries
//
DIRECTORY_ENTRY m_RootDirectoryPointer;
//
// Find handle list
//
PPFIND_HANDLE_INFO m_ppFindHandles;
DWORD m_cFindHandleListSize;
//
// File handle list
//
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -