WINAPI

2012-09-27 25 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为好。