Пример #1
0
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;
}
Пример #2
0
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)