2014-11-25 1 views
0

특정 물리 섹터의 일부 데이터를 SD 카드에 쓰려고합니다. 회사에서이 작업을 수행하는 코드를 받았는데 Windows XP에서 제대로 작동한다고합니다. WriteFile error #5 "denied access" under win Vista/seven
다음은 SD 카드에 데이터를 쓰는 부분입니다 (필자의 CUDRV 값은 'F'임). 다른 사람들을 읽고, 나는 잠금 장치를 추가했다. 그러나 잠금 장치는 실패하고 (또한 마운트 해제된다.) Windows 프로그래밍에 익숙하지 않습니다. 아무도이 코드에서 잘못된 점을 말해 줄 수 있습니까? 어떤 도움을 주셔서 감사합니다. (BTW I; 3GiB 잠금)WriteFile에서 물리 디스크, win7에 액세스가 거부되었습니다.

u32 HDD_write(u8 drv, u32 SecAddr, u32 blocks, u8 *buf) 
{ 
    u32 ret = 0; 
    u32 ldistanceLow, ldistanceHigh, dwpointer, bytestoread, numread; 
    char cur_drv[100]; 
    HANDLE g_hDevice; 

    sprintf(cur_drv, "\\\\.\\%c:",drv); // , (u32)drv); 
    g_hDevice = CreateFile(cur_drv, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); 

    if(g_hDevice == INVALID_HANDLE_VALUE) 
    return 0; 

    // lock and dismount 
    ret = LockFile(g_hDevice, 0, 0, 3 * 1023 * 1023 * 1023, 0); 
    printf("ret = %d", ret); 
    DeviceIoControl(g_hDevice, FSCTL_DISMOUNT_VOLUME, NULL, 0, NULL, 0, NULL, NULL); 
    printf("error = %d", GetLastError()); 

    ldistanceLow = SecAddr << 9; 
    ldistanceHigh = SecAddr >> (32-9); 
    dwpointer = SetFilePointer(g_hDevice, ldistanceLow, (long *)&ldistanceHigh, FILE_BEGIN); 

    if(dwpointer != 0xFFFFFFFF) { 
    bytestoread = blocks * 512; 
    ret = WriteFile(g_hDevice, buf, bytestoread, (unsigned long *)&numread, NULL); 
    if(ret) ret = 1; 
    else  { 
     ret = 0; 
     printf("error = %d", GetLastError()); 
    } 
    } 

    CloseHandle(g_hDevice); 
    return ret; 
} 
+0

'LockFile()'이 실패 할 때'GetLastError()'는 무엇을 반환합니까? – Cyclonecode

+0

'DeviceIoControl (g_hDevice, FSCTL_LOCK_VOLUME, NULL, 0, NULL, 0, & dwBytesReturned, NULL);을 사용하여 볼륨 잠금을 시도 했습니까? – Cyclonecode

+0

가능한 복제 [CreateFile : 원시 디스크에 직접 쓰기 작업 "액세스가 거부되었습니다"- Vista, Win7] (http://stackoverflow.com/questions/8694713/createfile-direct-write-operation-to-raw-disk- access-is-denied-vista-win7) – Xearinox

답변

1

나는이 문제를 며칠 전에 해결했으며 여기에서 내 질문을 잊어 버렸다. 이것은 내가 사용한 코드입니다. 파티션 된 디스크의 경우 파일을 만들 때 블록 장치에도 GENERIC_READ가 필요합니다. 키가 먼저 내려져 잠겼습니다.

u32 HDD_write(u8 drv, u32 SecAddr, u32 blocks, u8 *buf) { 
    u32 ret = 0; 
    u32 ldistanceLow, ldistanceHigh, dwpointer, bytestoread, numread; 
    char cur_drv[100]; 
    HANDLE g_hDevice; 
    DWORD status; 

    //sprintf(cur_drv, "\\\\.\\PhysicalDrive%d", drv); 
    sprintf(cur_drv, "\\\\.\\%c:",drv); 
    g_hDevice = CreateFile(cur_drv, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); 

    if(g_hDevice == INVALID_HANDLE_VALUE) 
    return 0; 

// dismout and lock added by ckim 

    if (!DeviceIoControl(g_hDevice, FSCTL_DISMOUNT_VOLUME, 
     NULL, 0, NULL, 0, &status, NULL)) 
    { 
     DWORD err = GetLastError(); 
     printf("Error %d attempting to dismount volume, error code\n",err); 
    } 

    // lock volume 
    if (!DeviceIoControl(g_hDevice, FSCTL_LOCK_VOLUME, 
     NULL, 0, NULL, 0, &status, NULL)) 
    { 
     printf("Error %d attempting to lock device\n", GetLastError()); 
    } 

    ldistanceLow = SecAddr << 9; 
    ldistanceHigh = SecAddr >> (32-9); 
    dwpointer = SetFilePointer(g_hDevice, ldistanceLow, (long *)&ldistanceHigh, FILE_BEGIN); 

    if(dwpointer != 0xFFFFFFFF) { 
    bytestoread = blocks * 512; 
    ret = WriteFile(g_hDevice, buf, bytestoread, (unsigned long *)&numread, NULL); 
    if(ret) ret = 1; 
    else  { 
     ret = 0; 
     printf("error = %d", GetLastError()); 
    } 
    } 

    CloseHandle(g_hDevice); 
    return ret; 
} 
관련 문제