1
votes

the code is here

HANDLE hDrive = CreateFile(_T("\\\\.\\D:"), GENERIC_READ, 
    FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, 
    NULL, 
    OPEN_ALWAYS, 
    FILE_ATTRIBUTE_NORMAL,///*FILE_FLAG_WRITE_THROUGH |*/FILE_FLAG_NO_BUFFERING, 
    NULL);
assert(hDrive != INVALID_HANDLE_VALUE);

I also tried CreateFile(_T("\\\.\D:",...) and OPEN_EXISTING, but also return INVALID_HANDLE_VALUE.

I called GetLastError(), and the error code is 5, ERROR_ACCESS_DENIED.

1
Have you looked at the result of GetLastError() to determine the associated error code? - Chris Becke
Thank you , I will take a look - bowman han
Try \\\\.\\PhysicalDrive1: instead of \\\\.\\D: or it might be PhysicalDrive0 depending on how drives are mapped. ps also OPEN_EXISTING as pointed out earlier. - Barmak Shemirani
The program must run elevated in order to get raw access to a drive. UAC elevation required, edit the program's manifest to display the prompt. - Hans Passant
The best quick lookup for error codes is to simply search for the number in <winerror.h>. In this case, 5 is ERROR_ACCESS_DENIED which correlates strongly with Hans Passant's analysis. - Chris Becke

1 Answers

3
votes

thanks to @Barmak Shemirani and @Hans Passant,

I got a workable code

HANDLE hDrive = CreateFile(_T("\\\\.\\PhysicalDrive0"), GENERIC_READ, 
    FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, 
    NULL, 
    OPEN_EXISTING, 
    FILE_ATTRIBUTE_READONLY,///*FILE_FLAG_WRITE_THROUGH |*/FILE_FLAG_NO_BUFFERING, 
    NULL);

and

HANDLE hDrive = CreateFile(_T("\\\\.\\D:"), GENERIC_READ|GENERIC_WRITE, 
    FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, 
    NULL, 
    OPEN_EXISTING, 
    FILE_ATTRIBUTE_READONLY,///*FILE_FLAG_WRITE_THROUGH |*/FILE_FLAG_NO_BUFFERING, 
    NULL);
DWORD dwError = GetLastError();

assert(hDrive != INVALID_HANDLE_VALUE);
cin.get();

need to run as administrator