reg*_*fry 4 winapi visual-c++ windows-7
我试图查找物理驱动器号(如,我需要N
在\\.\PhysicalDriveN
打开读取的块设备)从光盘驱动器在Windows 7的驱动器盘符本页面表明IOCTL_STORAGE_GET_DEVICE_NUMBER应该工作,但它返回0表示C:和D的驱动器号:(其中D:是可移动驱动器),因此不能正确.还建议使用IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS,但在D:上失败并出现ERROR_INVALID_FUNCTION.
我不禁觉得我错过了某个关键概念.
这是我的代码:
#include "stdafx.h"
#include "Windows.h"
void printLastError(){
DWORD lastError;
DWORD bytesReturned;
WCHAR outbuf[2048];
lastError = GetLastError();
bytesReturned = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,
NULL, lastError, LANG_USER_DEFAULT, outbuf, 2048, NULL);
if (bytesReturned > 0){
wprintf(outbuf);
} else {
printf("Error %d while formatting error %d\n", GetLastError(), lastError);
}
}
void readDeviceNumberByExtents(HANDLE hFile){
BOOL ioctlSuccess;
DWORD bytesReturned;
VOLUME_DISK_EXTENTS vde;
ioctlSuccess = DeviceIoControl(hFile,
IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS,
NULL, 0, &vde, sizeof(vde), &bytesReturned, NULL);
if (ioctlSuccess != 0){
printf("%d\n", vde.Extents->DiskNumber );
} else {
printLastError();
}
}
void readDeviceNumberByStorage(HANDLE hFile){
BOOL ioctlSuccess;
DWORD bytesReturned;
STORAGE_DEVICE_NUMBER sdn;
ioctlSuccess = DeviceIoControl(hFile,
IOCTL_STORAGE_GET_DEVICE_NUMBER,
NULL, 0, &sdn, sizeof(sdn), &bytesReturned, NULL);
if (ioctlSuccess != 0){
printf("%d\n", sdn.DeviceNumber );
} else {
printLastError();
}
}
void runTest(WCHAR* driveName){
HANDLE driveHandle;
DWORD diskNumber;
driveHandle = CreateFile(driveName,
0,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if (driveHandle != INVALID_HANDLE_VALUE){
wprintf(L"Opened %s\n", driveName);
printf("Device number by extents: ");
readDeviceNumberByExtents(driveHandle);
printf("Device number by storage: ");
readDeviceNumberByStorage(driveHandle);
CloseHandle(driveHandle);
} else {
printf("Failure!\n");
}
}
int _tmain(int argc, _TCHAR* argv[])
{
runTest(L"\\\\.\\C:");
printf("\n");
runTest(L"\\\\.\\D:");
getc(stdin);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
...以及以管理员身份运行它时的输出:
Opened \\.\C:
Device number by extents: 0
Device number by storage: 0
Opened \\.\D:
Device number by extents: Incorrect function.
Device number by storage: 0
Run Code Online (Sandbox Code Playgroud)
在"\\.\PhysicalDriveN"
只有工作(的东西,像)硬盘驱动器,而不是可移动磁盘.如果某些东西像可移动磁盘(或软盘,CD-ROM等),则"\\.\X:"
打开原始驱动器(其他驱动器不支持分区,因此它们之间的区别"\\.\x:"
和"\\.\PhysicalDiskN"
不存在).您通常希望用来GetDriveType
确定您拥有的磁盘类型,并且只有在DRIVE_FIXED
您说这是您尝试查找驱动器号并使用"\\.\PhysicalDriveN"
它时才会使用它.
归档时间: |
|
查看次数: |
12190 次 |
最近记录: |