📄 store.cpp
字号:
}
DEBUGMSG( ZONE_INIT, (L"FSDMGR!CStore::OpenDisk(0x%08X) DeviceInfo Class(0x%08X) Flags(0x%08X) Type(0x%08X) Profile(%s)\r\n",
this,
m_sdi.dwDeviceClass,
m_sdi.dwDeviceFlags,
m_sdi.dwDeviceType,
m_sdi.szProfile));
SetLastError( ERROR_SUCCESS);
if (ERROR_INSUFFICIENT_BUFFER == DeviceIoControl( NULL, IOCTL_DISK_GET_STORAGEID, NULL, 0, &storageid, sizeof(STORAGE_IDENTIFICATION), &dwRet)) {
m_pStorageId = new BYTE[storageid.dwSize];
DeviceIoControl( NULL, IOCTL_DISK_GET_STORAGEID, NULL, 0, m_pStorageId, storageid.dwSize, &dwRet);
}
}
return dwError;
}
void CStore::AddPartition(CPartition *pPartition)
{
if (m_pPartitionList) {
CPartition *pTemp = m_pPartitionList;
while(pTemp->m_pNextPartition) {
pTemp = pTemp->m_pNextPartition;
}
pTemp->m_pNextPartition = pPartition;
} else {
m_pPartitionList = pPartition;
}
}
void CStore::DeletePartition(CPartition * pPartition)
{
CPartition *pTemp = m_pPartitionList;
if (m_pPartitionList == pPartition) {
m_pPartitionList = pPartition->m_pNextPartition;
} else {
while(pTemp) {
if (pTemp->m_pNextPartition && (pTemp->m_pNextPartition == pPartition)) {
break;
}
pTemp = pTemp->m_pNextPartition;
}
if (pTemp) {
pTemp->m_pNextPartition = pPartition->m_pNextPartition;
}
}
UpdateHandleFromList(m_pRootHandle, NULL, pPartition);
delete pPartition;
}
CPartition *CStore::FindPartition(LPCTSTR szPartitionName)
{
CPartition *pPartition = m_pPartitionList;
while( pPartition) {
if (wcsicmp(pPartition->m_szPartitionName, szPartitionName) == 0) {
break;
}
pPartition = pPartition->m_pNextPartition;
}
return pPartition;
}
void CStore::GetPartitionCount()
{
DWORD dwSearchId;
m_dwPartCount = 0;
if (ERROR_SUCCESS == m_pPartDriver->FindPartitionStart(m_dwStoreId, &dwSearchId)) {
PD_PARTINFO pi;
while( ERROR_SUCCESS == m_pPartDriver->FindPartitionNext(dwSearchId, &pi)) {
m_dwPartCount++;
}
m_pPartDriver->FindPartitionClose(dwSearchId);
}
}
BOOL CStore::LoadPartition(LPCTSTR szPartitionName, BOOL bMount, BOOL bFormat)
{
DWORD dwPartitionId;
HANDLE hPartition;
if (ERROR_SUCCESS == m_pPartDriver->OpenPartition(m_dwStoreId, szPartitionName, &dwPartitionId)) {
CPartition *pPartition = new CPartition(this, m_dwStoreId, dwPartitionId, m_pPartDriver, m_szFolderName, m_pBlockDevice);
if (!pPartition) {
m_pPartDriver->ClosePartition(dwPartitionId);
return FALSE;
}
AddPartition( pPartition);
pPartition->LoadPartition(szPartitionName);
if (bMount && (m_dwFlags & STORE_ATTRIBUTE_AUTOMOUNT)) {
OpenPartition( szPartitionName, &hPartition, GetCurrentProcess());
if (pPartition->MountPartition(hPartition, m_szRootRegKey, m_szDefaultFileSystem, m_dwMountFlags, m_hActivityEvent, bFormat)) {
m_dwMountCount++;
}
}
return TRUE;
}
return FALSE;
}
void CStore::LoadExistingPartitions(BOOL bMount, BOOL bFormat)
{
DWORD dwSearchId;
if (ERROR_SUCCESS == m_pPartDriver->FindPartitionStart(m_dwStoreId, &dwSearchId)) {
PD_PARTINFO pi;
while( ERROR_SUCCESS == m_pPartDriver->FindPartitionNext(dwSearchId, &pi)) {
DEBUGMSG( 1, (L"Partition %s NumSectors=%ld\r\n", pi.szPartitionName, (DWORD)pi.snNumSectors));
LoadPartition(pi.szPartitionName, bMount, bFormat);
}
m_pPartDriver->FindPartitionClose(dwSearchId);
}
}
DWORD CStore::MountStore(BOOL bMount)
{
DWORD dwError = ERROR_GEN_FAILURE;
BOOL bFormat = FALSE;
if(ERROR_SUCCESS == (dwError = OpenDisk())) {
if (GetStoreSettings()) {
m_pPartDriver = new CPartDriver();
if (!m_pPartDriver) {
return ERROR_OUTOFMEMORY;
}
if (ERROR_SUCCESS == (dwError = m_pPartDriver->LoadPartitionDriver(m_szPartDriver))) {
dwError = m_pPartDriver->OpenStore( m_hDisk, &m_dwStoreId );
if (ERROR_DEVICE_NOT_PARTITIONED == dwError) {
if (m_dwStoreId)
m_pPartDriver->CloseStore( m_dwStoreId);
delete m_pPartDriver;
wcscpy( m_szPartDriver, L"");
m_pPartDriver = new CPartDriver();
if (!m_pPartDriver) {
return ERROR_OUTOFMEMORY;
}
m_pPartDriver->LoadPartitionDriver(m_szPartDriver);
dwError = m_pPartDriver->OpenStore( m_hDisk, &m_dwStoreId );
}
if (ERROR_SUCCESS == dwError) {
// Activity Timer Setup
if ((STORE_FLAG_ACTIVITYTIMER & m_dwFlags) && wcslen( m_szActivityName)) {
m_hActivityEvent = CreateEvent( NULL, FALSE, FALSE, m_szActivityName);
// there is really nothing we can do if event creation fails
DEBUGCHK(m_hActivityEvent);
}
DEBUGMSG( 1, (L"Opened the store hStore=%08X\r\n", m_dwStoreId));
m_si.cbSize = sizeof(PD_STOREINFO);
m_pPartDriver->GetStoreInfo( m_dwStoreId, &m_si);
DEBUGMSG( 1, (L"NumSec=%ld BytesPerSec=%ld FreeSec=%ld BiggestCreatable=%ld\r\n", (DWORD)m_si.snNumSectors, (DWORD)m_si.dwBytesPerSector, (DWORD)m_si.snFreeSectors, (DWORD)m_si.snBiggestPartCreatable));
if (ERROR_SUCCESS != m_pPartDriver->IsStoreFormatted(m_dwStoreId)) {
if (m_dwFlags & STORE_ATTRIBUTE_AUTOFORMAT) {
// TODO: Check for failure
m_pPartDriver->FormatStore(m_dwStoreId);
m_pPartDriver->GetStoreInfo( m_dwStoreId, &m_si);
}
}
if (ERROR_SUCCESS == m_pPartDriver->IsStoreFormatted(m_dwStoreId)) { // Retry again if we formatted it
GetPartitionCount();
if (!m_dwPartCount) {
if (m_dwFlags & STORE_ATTRIBUTE_AUTOPART) {
PD_STOREINFO si;
si.cbSize = sizeof(PD_STOREINFO);
m_pPartDriver->GetStoreInfo(m_dwStoreId, &si);
if ( (ERROR_SUCCESS == m_pPartDriver->CreatePartition(m_dwStoreId, L"PART00", 0, si.snBiggestPartCreatable, TRUE)) &&
(ERROR_SUCCESS == m_pPartDriver->FormatPartition(m_dwStoreId, L"PART00", 0, TRUE))) {
m_pPartDriver->GetStoreInfo( m_dwStoreId, &m_si);
DEBUGMSG( 1, (L"NumSec=%ld BytesPerSec=%ld FreeSec=%ld BiggestCreatable=%ld\r\n", (DWORD)m_si.snNumSectors, (DWORD)m_si.dwBytesPerSector, (DWORD)m_si.snFreeSectors, (DWORD)m_si.snBiggestPartCreatable));
m_dwPartCount = 1;
bFormat = TRUE;
}
}
}
LoadExistingPartitions(bMount, bFormat);
}
m_dwFlags |= STORE_FLAG_MOUNTED;
}
}
}
}
return dwError;
}
BOOL CStore::UnmountStore(BOOL bDelete)
{
CPartition *pPartition = m_pPartitionList;
while( pPartition) {
if (pPartition->IsPartitionMounted()) {
if (pPartition->UnmountPartition()) {
m_dwMountCount--;
} else {
pPartition = pPartition->m_pNextPartition;
continue;
}
}
if (bDelete) {
m_pPartitionList = pPartition->m_pNextPartition;
UpdateHandleFromList(m_pRootHandle, NULL, pPartition);
delete pPartition;
pPartition = m_pPartitionList;
} else {
pPartition = pPartition->m_pNextPartition;
}
}
return (m_dwMountCount == 0);
}
DWORD CStore::FormatStore()
{
DWORD dwError = ERROR_SUCCESS;
Lock();
if (m_dwMountCount) {
dwError = ERROR_DEVICE_IN_USE;
}
else if (m_dwFlags & STORE_ATTRIBUTE_READONLY) {
dwError = ERROR_ACCESS_DENIED;
}
else if (ERROR_SUCCESS == (dwError = m_pPartDriver->FormatStore( m_dwStoreId))) {
if (m_dwFlags & STORE_FLAG_MOUNTED) {
UnmountStore();
}
m_dwPartCount = 0;
m_si.cbSize = sizeof(PD_STOREINFO);
m_pPartDriver->GetStoreInfo(m_dwStoreId, &m_si);
// TODO: Should we auto partition here ???
}
Unlock();
return dwError;
}
DWORD CStore::CreatePartition(LPCTSTR szPartitionName, BYTE bPartType, SECTORNUM snNumSectors, BOOL bAuto)
{
DWORD dwError = ERROR_SUCCESS;
Lock();
if (snNumSectors == 0) {
snNumSectors = m_si.snBiggestPartCreatable;
}
if (ERROR_SUCCESS == (dwError = m_pPartDriver->CreatePartition(m_dwStoreId, szPartitionName, bPartType, snNumSectors, bAuto))) {
m_pPartDriver->GetStoreInfo(m_dwStoreId, &m_si);
// Load up the new partition
LoadPartition(szPartitionName, TRUE, TRUE);
m_dwPartCount++;
}
Unlock();
return dwError;
}
DWORD CStore::DeletePartition(LPCTSTR szPartitionName)
{
DWORD dwError = ERROR_SUCCESS;
CPartition *pPartition;
Lock();
if (pPartition = FindPartition( szPartitionName)) {
if (pPartition->IsPartitionMounted()) {
dwError = ERROR_DEVICE_IN_USE;
} else {
if (ERROR_SUCCESS == (dwError = m_pPartDriver->DeletePartition(m_dwStoreId, szPartitionName))) {
DeletePartition(pPartition);
m_pPartDriver->GetStoreInfo(m_dwStoreId, &m_si);
m_dwPartCount--;
}
}
}
Unlock();
return dwError;
}
DWORD CStore::OpenPartition(LPCTSTR szPartitionName, HANDLE *pbHandle, HANDLE hProc)
{
DWORD dwError = ERROR_SUCCESS;
STOREHANDLE *pStoreHandle = new STOREHANDLE;
*pbHandle = INVALID_HANDLE_VALUE;
if (!pStoreHandle) {
return ERROR_OUTOFMEMORY;
}
Lock();
if (pStoreHandle->pPartition = FindPartition(szPartitionName)) {
pStoreHandle->pStore = this;
pStoreHandle->pNext = NULL;
pStoreHandle->dwFlags = 0;
pStoreHandle->dwSig = PART_HANDLE_SIG;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -