2012-05-27 1 views
1

주소가 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) 문서를 읽었습니다. 내가 다른 코드를 수행하기 전에 내 코드에서 DeviceIoControlFSCTL_LOCK_VOLUME으로 장치를 잠그는 것이 왜 문제가되는지 혼란 스럽다. 디스크에 활성 파일 시스템 (FAT32/FAT16)이 있고 0x600 영역이 파일 시스템 내에있을 가능성이 있지만 기사에 따라 드라이브를 잠그면 기록 할 수 있습니다. 무슨 일이 벌어지고 있는거야? 감사!

+1

게시 한 스 니펫은 오류 코드를 제공 할 수 없으며 사용자가 볼 수없는 코드에 대해 이야기하고 있습니다. 잠금이 성공했는지 확인하지 않습니다. 그리고 우리 모두가 알고 있듯이 WriteFile이 FALSE를 반환하지 않더라도 GetLastError를 호출 할 수 있습니다. 그리고 잘못된 인수를 전달하면 길이가 올바르지 않습니다. –

+0

@HansPassant 내가 말한 것처럼 오류 검사로 코드를 업데이트했습니다. 잠금이 성공했는지 확인하기에 충분한'DeviceIoControl'의 리턴 코드를 확인하고 있습니까? 또한 올바른 길이는 무엇입니까? 0x4C입니까? 감사. – user99545

답변

0

DeviceIoControlSetFilePointer에 오류 표시가 남았습니까? 시도하고있는 작업을 수행 할 권한이 있습니까? 원시 디스크 쓰기 IIRC에는 관리자 계정이 필요합니다.

시스템 디스크를 여는 디스크가 있습니까? (OS 파일을 포함합니까?) 그렇다면 Lock IOCTL이 실패합니다.

잠금을 시도한 디스크에 페이지 파일이있는 경우 IOCTL 잠금이 실패합니다.

+0

더 많은 오류 검사를 위해 코드를 업데이트했습니다. 관리자 계정으로 관리자 권한으로 프로그램을 실행하고 있습니다. 시스템 디스크가 아니라 이동식 엄지 드라이브입니다. 페이지 파일이 없습니다. – user99545

+0

@ user99545 ​​: 정말 다른 문제는 보이지 않습니다. 'memcpy'에 대한 호출의 길이가 잘못되었지만, 문제가 있다고 생각하지 않습니다. 나는 어떤 매개 변수 창이 잘못되었다고 생각하는지 궁금하다. – JimR