long CDiskImageStream::OpenDevice(DWORD shareMode) { long ntStatus; DWORD access = (fOpenMode==forWriting) ? (GENERIC_READ | GENERIC_WRITE | SYNCHRONIZE) : GENERIC_READ| SYNCHRONIZE; ATLTRACE("Opening raw disk device: %S.\n", fName.c_str()); ntStatus = NTOpen(&fHandle, fName.c_str(), access, FILE_ATTRIBUTE_NORMAL, shareMode, FILE_OPEN, FILE_SYNCHRONOUS_IO_NONALERT|FILE_RANDOM_ACCESS|FILE_NON_DIRECTORY_FILE); return ntStatus; }
void CSubVolumeLocker::OpenAndLockVolume(LPCWSTR volName, int index) { DWORD res, access, dummy; long ntStatus; HANDLE h; access = GENERIC_READ | GENERIC_WRITE | SYNCHRONIZE; DWORD shareMode = FILE_SHARE_READ | FILE_SHARE_WRITE; ATLTRACE("Opening sub volume: %S.\n", volName); ntStatus = NTOpen(&h, volName, access, FILE_ATTRIBUTE_NORMAL, shareMode, FILE_OPEN, FILE_SYNCHRONOUS_IO_NONALERT|FILE_RANDOM_ACCESS|FILE_NON_DIRECTORY_FILE); CHECK_KERNEL_EX_HANDLE_PARAM1(ntStatus, EWinException::volumeOpenError, volName); ATLTRACE("Opened sub volume: %S with handle %u\n", volName, h); fHandles[index] = h; res = DeviceIoControl(h, FSCTL_LOCK_VOLUME, NULL, 0, NULL, 0, &dummy, NULL); CHECK_OS_EX_PARAM1(res, EWinException::ioControlError, L"FSCTL_LOCK_VOLUME"); }
//--------------------------------------------------------------------------- // Open an image store - this determines the type of the store and whether // or not NT open functions are available and then decides the best way // to open the target. // bool __fastcall TImageStore::Open(void) { FGeometry.Bytes = (unsigned long long)0; FGeometry.BytesPerSector = (unsigned long long)0; bool bSuccess; switch (FType) { case isFile: { LARGE_INTEGER nnFileSize; DWORD ShareMode = FILE_SHARE_READ;//(bWriteAccess?0:FILE_SHARE_READ); DWORD CreateMode = (bWriteAccess?CREATE_ALWAYS:OPEN_EXISTING); DWORD Access = GENERIC_READ | (bWriteAccess?GENERIC_WRITE:0); hHandle = CreateFile(FFileName.c_str(), Access, ShareMode, NULL, CreateMode, FILE_ATTRIBUTE_NORMAL, NULL); if (hHandle != INVALID_HANDLE_VALUE) { if (!bWriteAccess) { nnFileSize.LowPart = GetFileSize(hHandle, (unsigned long *)&nnFileSize.HighPart); FGeometry.Bytes = nnFileSize.QuadPart; CheckCompression(); } else FGeometry.Bytes = 0; //-1; FGeometry.BytesPerSector = 0; FGeometry.BytesPerCluster = 0; } else return false; break; } // case isFile: case isDrive: { PARTITION_INFORMATION PartitionInfo; DISK_GEOMETRY DiskGeometry; DWORD Dummy; // A example for a valid file name is: \\.\C DWORD Access = GENERIC_READ | (bWriteAccess?GENERIC_WRITE:0); DWORD ShareMode = (bWriteAccess?0:FILE_SHARE_READ|FILE_SHARE_WRITE); if (HaveNTCalls ) { wchar_t wFileName[255]; int pos = 0; for (pos = 0; pos < FFileName.size(); pos++) { wFileName[pos] = FFileName[pos]; wFileName[pos+1] = L'\0'; } hHandle = NTOpen(wFileName, SYNCHRONIZE | Access, FILE_ATTRIBUTE_NORMAL, ShareMode, FILE_OPEN, FILE_SYNCHRONOUS_IO_NONALERT | FILE_SEQUENTIAL_ONLY); } else { if (strncmp ("\\Device\\Floppy", FFileName.c_str(), 14) == 0) { printf ("Make open floppy fail\n"); return false; } printf ("%s line %i: Try to open %s\n", __FILE__, __LINE__, FFileName.c_str()); hHandle = CreateFile(FFileName.c_str(), GENERIC_READ, ShareMode, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN | FILE_FLAG_BACKUP_SEMANTICS, NULL); } if (hHandle != INVALID_HANDLE_VALUE) { bSuccess = DeviceIoControl(hHandle, IOCTL_DISK_GET_PARTITION_INFO, NULL, 0, &PartitionInfo, sizeof(PartitionInfo), &Dummy, NULL); if (!bSuccess) { Close(); return false; } bSuccess = DeviceIoControl(hHandle, IOCTL_DISK_GET_DRIVE_GEOMETRY , NULL, 0, &DiskGeometry, sizeof(DiskGeometry), &Dummy, NULL); if (!bSuccess) { Close(); return false; } FGeometry.Bytes = (unsigned long long)PartitionInfo.PartitionLength.QuadPart; FGeometry.BytesPerSector = DiskGeometry.BytesPerSector; #ifdef DEBUG_PARTSIZE printf("Bytes: %llu\n", FGeometry.Bytes); if ( FGeometry.Bytes == (__uint64)0) printf ("Hallo\n"); #endif #if 0 // Check to see if we're dealing with a floppy. Does anyone have one any more? if (FFileName.Pos("Floppy") || FileName.Pos("A:") || FileName.Pos("B:")) FGeometry.Bytes = DiskGeometry.Cylinders.QuadPart * DiskGeometry.TracksPerCylinder * DiskGeometry.SectorsPerTrack * DiskGeometry.BytesPerSector; #endif } else { printf ("invalid file handle\n"); return false; } #if 0 CheckFileSystem(); #endif break; } // case isDrive: case isNBD: { printf ("%s line %i: Here\n", __FILE__, __LINE__); return false; #ifdef _WIN32 #if 0 AnsiString Host; int nPort = 0; SplitConnectionString(FFileName, Host, nPort); if (NBDConnection) delete NBDConnection; NBDConnection = new TNBDClient(NULL); NBDConnection->Host = Host; NBDConnection->Port = nPort; NBDConnection->Timeout = SelfImageConfig->Values["NBDTimeout"]; NBDConnection->TransactionSize = SelfImageConfig->Values["NBDTransactionSize"] * 1024; NBDConnection->Open(); FGeometry.Bytes = NBDConnection->Size; CheckFileSystem(); #endif #endif } // case isNBD: default: // ERROR return false; break; } // switch (Type) return (hHandle != INVALID_HANDLE_VALUE); } // bool __fastcall TImageStore::Open(void)