Code pertinente est la suivante:DeviceIoControl() avec IOCTL_DISK_GET_DRIVE_GEOMETRY échoue et renvoie le code d'erreur 87. Pourquoi?
std::wstring path = ApplicationData::Current->LocalFolder->Path->Data();
std::wstring testFileName = path + std::wstring(L"\\TestVariablySized");
this->hMappedFile = CreateFile2(
testFileName.c_str(),
GENERIC_READ | GENERIC_WRITE,
0,
OPEN_ALWAYS,
NULL);
uint32_t checkF = GetLastError();
DISK_GEOMETRY geo = { 0 };
DWORD bReturned = 0;
bool controlCheck = DeviceIoControl(
(HANDLE)hMappedFile, // handle to device
IOCTL_DISK_GET_DRIVE_GEOMETRY, // dwIoControlCode
NULL, // lpInBuffer
0, // nInBufferSize
(LPVOID)&geo, // output buffer
(DWORD)sizeof(geo), // size of output buffer
(LPDWORD)&bReturned, // number of bytes returned
NULL);
uint32_t check = GetLastError();
Après cela, controlCheck
est faux et check
est ERROR_INVALID_PARAMETER
. checkF
est ERROR_ALREADY_EXISTS
, ce qui ne devrait pas poser de problème ici.
Pour autant que je sache, j'ai appelé DeviceIoControl()
d'une manière cohérente avec le IOCTL_DISK_GET_DRIVE_GEOMETRY
documentation. , mais il me manque quelque chose. Votre aide est la plus appréciée.
Edit:
par les réponses reçues, je modifié les choses soient comme suit:
HANDLE hDevice = CreateFile2(
L"\\.\PhysicalDrive0",
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
OPEN_EXISTING,
NULL);
uint32_t checkF = GetLastError();
DISK_GEOMETRY geo = { 0 };
DWORD bReturned = 0;
bool controlCheck = DeviceIoControl(
hDevice, // handle to device
IOCTL_DISK_GET_DRIVE_GEOMETRY, // dwIoControlCode
NULL, // lpInBuffer
0, // nInBufferSize
(LPVOID)&geo, // output buffer
(DWORD)sizeof(geo), // size of output buffer
(LPDWORD)&bReturned, // number of bytes returned
NULL);
uint32_t check = GetLastError();
CloseHandle(hDevice);
qui devrait être plus proche d'être correct, même si ce n'est pas encore tout à fait correct. checkF
est ERROR_FILE_NOT_FOUND
, que j'ai trouvé étrange. J'ai aussi essayé "\\.\PhysicalDrive1"
et "\\.\PhysicalDrive2"
, mais j'ai reçu le même résultat. controlCheck
est toujours faux, mais vérifiez maintenant ERROR_INVALID_HANDLE
.
AFAIK, '' IOCTL_DISK_ * ne fonctionne que si vous ouvrez le disque lui-même, vous ne pouvez pas envoyer ceux pour ouvrir les poignées pour les fichiers à l'intérieur des volumes à l'intérieur du disque. –