WINAPI

2012-09-27 26 views
0

我'試圖創建新的分區和安裝捲到這個新創建新分區的磁盤,我認爲CreateFile讓我做到這一點,使用此代碼:WINAPI

LPCTSTR lpFileName=L"\\\\.\\Device\\Harddisk0\\Partition3"; 
HANDLE handl=CreateFile(lpFileName, 
          GENERIC_READ | GENERIC_WRITE, 
          FILE_SHARE_READ | FILE_SHARE_WRITE, 
          NULL, 
          CREATE_ALWAYS, 
          FILE_ATTRIBUTE_NORMAL, 
          NULL ); 
    if (handl==INVALID_HANDLE_VALUE) 
    { 
    qDebug()<<"handl invalid"<<" error"<<GetLastError();} 


    bool success = DefineDosDevice(DDD_RAW_TARGET_PATH,L"I:",L"\\Device\\Harddisk0\\Partition3"); 
    if(!success) 
     qDebug()<<" DefineDosDevice failed "<<GetLastError(); 


    bFlag = GetVolumeNameForVolumeMountPoint(
       L"I:\\", // input volume mount point or directory 
       /** what u do in this directory u find it in th mount piont and vice versa**/ 
        Buf, // output volume name buffer 
       BUFSIZE // size of volume name buffer 
      ); 
    if (bFlag != TRUE) 
    { 
     //_tprintf(TEXT("Retrieving volume name for %s failed.\n"), argv[2]); 
     qDebug()<<"Retrieving volume name failed.  "<<GetLastError(); 
     return (-2); 
    } 
    qDebug()<<"Volume name"<<QString::fromWCharArray(Buf); 



    bool fResult = DefineDosDevice (
         DDD_RAW_TARGET_PATH|DDD_REMOVE_DEFINITION| 
         DDD_EXACT_MATCH_ON_REMOVE, L"I:", 
         L"\\Device\\Harddisk0\\Partition3"); 
    if (!fResult) 
       qDebug()<<"DefineDosDevice failed "<< GetLastError(); 



    bFlag = SetVolumeMountPoint(L"D:\\myDirExample\\example\\", // mount point 
           /** should b empty**/ 
           Buf // volume to be mounted 
           ); 

    if (!bFlag) 
     { 
     qDebug()<<"Attempt to mount failed"; 
     qDebug()<<"error "<<GetLastError(); 
     } 

    return (bFlag); 


    CloseHandle(handl); 

我:

handl invalid error 3 
Retrieving volume name failed erorr 2 

第一個錯誤是ERROR_PATH_NOT_FOUND:系統找不到指定的路徑。 那麼,我該如何修復lpFileName才能使其工作

在此先感謝,任何幫助將不勝感激。

+1

沒有'\\。\ Device',這就是爲什麼你得到ERROR_PATH_NO_FOUND。沒有辦法從win32訪問NT的'\ Device'(你必須改用NtCreateFile)。即使有,您也只能在設備上創建文件(例如,如果'\ Device \ Harddisk0 \ Partition3'是設備,您可以創建'\ Device \ Harddisk0 \ Partition3 \ something')。 '\ Device \ Harddisk0'不是任何設備的一部分(都是NT命名空間中的簡單目錄)。 – avakar

+0

感謝您的回答,那是我的觀點'\ Device \ Harddisk0 \ Partition3'是我想創建的分區,它不存在。 – Oumaya

+0

我不認爲有創建分區的API等。您可以控制[diskpart工具](http://technet.microsoft.com/en-us/library/26a4a166-95fa-4faf-95bc-2d5345f4a57a )與腳本。 – arx

回答

0

有,我用它爲我的粉碎機。唯一棘手的部分是管理文件指針的LARGE_INTEGER(用於選擇扇區)。您需要首先使用CreateFile()來使用設備的句柄。完成後用FSCTL_LOCK_VOLUME鎖定驅動器後,使用SetFilepointerEx設置扇區並使用IOCTL_DISK_SET_PARTITION_INFO_EX創建新扇區。

乾杯;)

編輯幾次 - 如果需要IOCTL_DISK_SET_PARTITION_INFO也不能肯定,但它不是,你可以設置類型與IOCTL_DISK_SET_PARTITION_INFO_EX爲好。