📄 partition.cpp
字号:
BOOL CPartition::GetPartitionInfo(PARTINFO *pInfo)
{
__try {
pInfo->bPartType = m_pi.bPartType;
pInfo->dwAttributes = m_dwFlags;
memcpy( &pInfo->ftCreated, &m_pi.ftCreated, sizeof(FILETIME));
memcpy( &pInfo->ftLastModified, &m_pi.ftLastModified, sizeof(FILETIME));
pInfo->snNumSectors = m_pi.snNumSectors;
VERIFY(SUCCEEDED(StringCchCopy( pInfo->szPartitionName, PARTITIONNAMESIZE, m_szPartitionName)));
if (wcslen(m_szFriendlyName)) {
wcsncpy( pInfo->szFileSys, m_szFriendlyName, FILESYSNAMESIZE-1);
} else {
wcsncpy( pInfo->szFileSys, m_szFileSys, FILESYSNAMESIZE-1);
}
pInfo->szFileSys[FILESYSNAMESIZE-1] = 0;
if (m_hFSD && m_pDsk && m_pDsk->pVol) {
VERIFY(SUCCEEDED(StringCchCopy(pInfo->szVolumeName, VOLUMENAMESIZE, m_pDsk->pVol->wsVol)));
} else {
VERIFY(SUCCEEDED(StringCchCopy(pInfo->szVolumeName, VOLUMENAMESIZE, L"")));
}
} __except(EXCEPTION_EXECUTE_HANDLER) {
return FALSE;
}
return TRUE;
}
BOOL CPartition::LoadPartition(LPCTSTR szPartitionName)
{
wcsncpy( m_szPartitionName, szPartitionName, PARTITIONNAMESIZE-1);
m_szPartitionName[PARTITIONNAMESIZE-1] = 0;
m_pPartDriver->GetPartitionInfo(m_dwStoreId, szPartitionName, &m_pi);
return TRUE;
}
BOOL CPartition::MountPartition(HANDLE hPartition, LPCTSTR szRootRegKey, LPCTSTR szDefaultFileSystem, DWORD dwMountFlags, HANDLE hActivityEvent, BOOL bFormat)
{
TCHAR szRegKey[MAX_PATH];
TCHAR szPartId[10];
HKEY hKey = NULL;
m_hPartition = hPartition;
BOOL bRet = TRUE;
DWORD dwTmpFlags;
DWORD dwCheckForFormat = 0;
VERIFY(SUCCEEDED(StringCchCopy(m_szRootKey, MAX_PATH, szRootRegKey)));
FsdRegOpenKey( m_szRootKey, &hKey);
if (hKey) {
FsdGetRegistryValue(hKey, g_szCHECKFORFORMAT, &dwCheckForFormat);
FsdRegCloseKey( hKey);
}
VERIFY(SUCCEEDED(StringCchPrintf(szRegKey, MAX_PATH, L"%s\\%s", m_szRootKey, g_szPART_TABLE_STRING)));
VERIFY(SUCCEEDED(StringCchCopy(m_szFileSys, FILESYSNAMESIZE, szDefaultFileSystem)));
if (ERROR_SUCCESS != FsdRegOpenKey( szRegKey, &hKey)) {
VERIFY(SUCCEEDED(StringCchPrintf(szRegKey, MAX_PATH, L"%s\\%s", g_szSTORAGE_PATH, g_szPART_TABLE_STRING)));
FsdRegOpenKey( szRegKey, &hKey);
}
if (hKey) {
TCHAR* szTempId = szPartId;
DUMPREGKEY(ZONE_INIT, szRegKey, hKey);
// Convert m_pi.bPartType into a string in %02x format.
if (m_pi.bPartType < 0x10)
*szTempId++ = L'0';
_itow (m_pi.bPartType, szTempId, 16);
if (!FsdGetRegistryString(hKey, szPartId, m_szFileSys, sizeof(m_szFileSys)/sizeof(WCHAR))) {
VERIFY(SUCCEEDED(StringCchCopy(m_szFileSys, FILESYSNAMESIZE, szDefaultFileSystem)));
}
FsdRegCloseKey(hKey);
}
VERIFY(SUCCEEDED(StringCchPrintf(szRegKey, MAX_PATH, L"%s\\%s", m_szRootKey, m_szFileSys)));
if (ERROR_SUCCESS == FsdRegOpenKey( szRegKey, &hKey)) {
TCHAR szFolderName[FOLDERNAMESIZE];
GetMountSettings(hKey, &dwMountFlags);
if (FsdGetRegistryValue(hKey, g_szCHECKFORFORMAT, &dwTmpFlags)) {
dwCheckForFormat = dwTmpFlags;
}
if (FsdGetRegistryString(hKey, g_szFOLDER_NAME_STRING, szFolderName, sizeof(szFolderName)/sizeof(WCHAR))) {
VERIFY(SUCCEEDED(StringCchCopy(m_szFolderName, FOLDERNAMESIZE, szFolderName)));
}
FsdRegCloseKey(hKey);
}
VERIFY(SUCCEEDED(StringCchPrintf(szRegKey, MAX_PATH, L"%s\\%s", m_szRootKey, m_szPartitionName)));
if (ERROR_SUCCESS == FsdRegOpenKey( szRegKey, &hKey)) {
TCHAR szFolderName[FOLDERNAMESIZE];
GetMountSettings(hKey, &dwMountFlags);
if (FsdGetRegistryString(hKey, g_szFOLDER_NAME_STRING, szFolderName, sizeof(szFolderName)/sizeof(WCHAR))) {
VERIFY(SUCCEEDED(StringCchCopy(m_szFolderName, FOLDERNAMESIZE, szFolderName)));
}
FsdRegCloseKey( hKey);
}
m_dwMountFlags = dwMountFlags;
#ifdef UNDER_CE
if (dwCheckForFormat == 1) {
STORAGECONTEXT sc;
BOOL fFormat = 0;
memset(&sc, 0, sizeof(sc));
sc.cbSize = sizeof(sc);
m_pStore->GetStoreInfo( &sc.StoreInfo);
GetPartitionInfo(&sc.PartInfo);
sc.dwFlags = m_dwMountFlags;
if (KernelIoControl(IOCTL_HAL_QUERY_FORMAT_PARTITION, &sc, sizeof(sc), (LPBYTE)&fFormat, sizeof(BOOL), NULL) && fFormat) {
FormatPartition(m_pi.bPartType, FALSE);
bFormat = TRUE;
}
}
#endif // UNDER_CE
if (wcslen(m_szFileSys)) {
GetFSDString( g_szFILE_SYSTEM_MODULE_STRING, m_szModuleName, sizeof(m_szModuleName)/sizeof(WCHAR));
GetFSDString( g_szFILE_SYSTEM_MODULE_STRING, m_szFriendlyName, sizeof(m_szFriendlyName)/sizeof(WCHAR));
if (m_szModuleName) {
m_hFSD = LoadDriver( m_szModuleName);
if (m_hFSD) {
FSDINITDATA fid;
fid.pIoControl = (PDEVICEIOCONTROL)PartitionIoControl;
fid.hDsk = (HANDLE)this;
fid.hPartition = hPartition;
fid.dwFlags = m_dwMountFlags;
fid.hActivityEvent = hActivityEvent;
fid.pPartition = this;
fid.pStore = m_pStore;
VERIFY(SUCCEEDED(StringCchCopy(fid.szFileSysName, FILESYSNAMESIZE, m_szFileSys)));
VERIFY(SUCCEEDED(StringCchCopy(fid.szRegKey, MAX_PATH, szRootRegKey)));
VERIFY(SUCCEEDED(StringCchCopy(fid.szDiskName, MAX_PATH, m_szPartitionName)));
fid.hFSD = m_hFSD;
fid.pNextDisk = NULL;
fid.bFormat = bFormat;
m_pDsk = InitEx( &fid);
}
}
}
if (m_pDsk) {
m_dwFlags |= PARTITION_ATTRIBUTE_MOUNTED;
} else {
if (m_hFSD) {
FreeLibrary( m_hFSD);
m_hFSD = NULL;
}
bRet = FALSE;
}
return bRet;
}
BOOL CPartition::UnmountPartition()
{
if (m_dwMountFlags & MOUNTFLAGS_TYPE_NODISMOUNT)
return FALSE;
if (m_pDsk) {
if (!DeinitEx(m_pDsk)) {
return FALSE;
}
m_pDsk = NULL;
}
if (m_hFSD) {
FreeLibrary( m_hFSD);
m_hFSD = NULL;
}
m_dwFlags &= ~PARTITION_ATTRIBUTE_MOUNTED;
#ifdef UNDER_CE
CloseHandle( m_hPartition);
#endif
return TRUE;
}
BOOL CPartition::RenamePartition(LPCTSTR szNewName)
{
DWORD dwError = ERROR_SUCCESS;
if (ERROR_SUCCESS == (dwError = m_pPartDriver->RenamePartition(m_dwStoreId, m_szPartitionName, szNewName))) {
VERIFY(SUCCEEDED(StringCchCopy(m_szPartitionName, PARTITIONNAMESIZE, szNewName)));
return TRUE;
}
SetLastError(dwError);
return FALSE;
}
BOOL CPartition::FormatPartition(BYTE bPartType, BOOL bAuto)
{
DWORD dwError = ERROR_SUCCESS;
if (ERROR_SUCCESS == (dwError = m_pPartDriver->FormatPartition(m_dwStoreId, m_szPartitionName, bPartType, bAuto))) {
m_pPartDriver->GetPartitionInfo(m_dwStoreId, m_szPartitionName, &m_pi);
return TRUE;
}
SetLastError(dwError);
return FALSE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -