주소가 0x600 인 디스크에 약 100 바이트 길이의 문자열을 쓰는 데 사용하려고하는 약간의 스 니펫이 있습니다. .Windows에서 디스크에 원시 데이터를 쓰는 중 오류 코드 83 (유효하지 않은 매개 변수)으로 실패합니다.
UCHAR szStr[0x4C] = {0};
memcpy(szStr, "Example string", 8);
DWORD bytes, cb;
HANDLE hDisk = CreateFile("\\\\.\\I:", GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
if (hDisk == INVALID_HANDLE_VALUE)
{
cout << "CreateFile error"<< endl << GetLastError();
}
if (!DeviceIoControl(hDisk, FSCTL_LOCK_VOLUME, NULL, 0, NULL, 0, &cb, NULL))
{
cout << "IO Error"<< endl << GetLastError();
}
if (SetFilePointer(hDisk, 0x600, NULL, FILE_BEGIN) == INVALID_SET_FILE_POINTER)
{
cout << "Pointer error"<< endl << GetLastError();
}
if (!WriteFile(hDisk, szStr, 0x4C, &bytes, 0))
{
cout << "Write error" << endl << GetLastError(); //Only one that triggers (err code 87)
}
CloseHandle(hDisk);
WriteFile()
이 실패 할 때까지는 아무 이유없이 모든 것이 정상입니다. GetLastError()
은 83의 코드 즉 INVALID_PARAMETER
을 리턴합니다. 나는 드라이브 I:\
대신에 바탕 화면에 일반 파일을 지정하여 디버깅을 시도하고 성공적으로 작동하므로 드라이브에 디스크 핸들과 함께 문제가 발생합니다. I:\
.
먼저 드라이브를 잠그지 않았거나 분리하지 않은 경우 원시 디스크 I/O가 차단된다는 설명이있는 MSDN (here) 문서를 읽었습니다. 내가 다른 코드를 수행하기 전에 내 코드에서 DeviceIoControl
과 FSCTL_LOCK_VOLUME
으로 장치를 잠그는 것이 왜 문제가되는지 혼란 스럽다. 디스크에 활성 파일 시스템 (FAT32/FAT16)이 있고 0x600 영역이 파일 시스템 내에있을 가능성이 있지만 기사에 따라 드라이브를 잠그면 기록 할 수 있습니다. 무슨 일이 벌어지고 있는거야? 감사!
게시 한 스 니펫은 오류 코드를 제공 할 수 없으며 사용자가 볼 수없는 코드에 대해 이야기하고 있습니다. 잠금이 성공했는지 확인하지 않습니다. 그리고 우리 모두가 알고 있듯이 WriteFile이 FALSE를 반환하지 않더라도 GetLastError를 호출 할 수 있습니다. 그리고 잘못된 인수를 전달하면 길이가 올바르지 않습니다. –
@HansPassant 내가 말한 것처럼 오류 검사로 코드를 업데이트했습니다. 잠금이 성공했는지 확인하기에 충분한'DeviceIoControl'의 리턴 코드를 확인하고 있습니까? 또한 올바른 길이는 무엇입니까? 0x4C입니까? 감사. – user99545