Создание партиции в неразмеченной области... как?

Тема в разделе "WASM.WIN32", создана пользователем MIA2000, 26 июл 2006.

  1. MIA2000

    MIA2000 New Member

    Публикаций:
    0
    Регистрация:
    11 мар 2004
    Сообщения:
    9
    Адрес:
    RUSSIA
    Добрый день, если не сложно кинте примерчик создания партиции, как создавать партицию на RAW диске мне ясно, но как ее создать на размеченном диске, с имеющемся не используемом пространстве? Если не сложно можно примером =) спасибо.
     
  2. iloq

    iloq New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2005
    Сообщения:
    10
    А что мешает просто добавить еще одну запись в таблицу разделов (partition table) MBR? Просто нужно вычислить неиспользуемый кусок на диске (в секторах), а потом записать
    начало и конец в таблицу (в LBA и CHS). Или я не так понял? Как ты создаешь партицию на RAW диске?
     
  3. MIA2000

    MIA2000 New Member

    Публикаций:
    0
    Регистрация:
    11 мар 2004
    Сообщения:
    9
    Адрес:
    RUSSIA
    Вот так
    Код (Text):
    1. #define _WIN32_WINNT  0x500
    2.  
    3. #include <windows.h>
    4. #include<Winioctl.h>
    5. #include<vector>
    6. #include<iostream>
    7. #include<shlobj.h>
    8. #include <stdio.h>
    9. #include "tchar.h"
    10.  
    11. using namespace std;
    12.  
    13.  
    14.  
    15. //#define _WIN32_WINNT 0x0501
    16.  
    17. #include <string>
    18. #include<iostream>
    19. #include "fmifs.h"
    20. #define _UNICODE 1
    21.  
    22.  
    23. #define BUFSIZE            MAX_PATH
    24. #define FILESYSNAMEBUFSIZE MAX_PATH
    25. BOOL Error = FALSE;
    26.  
    27. PFORMATEX   FormatEx;
    28. PENABLEVOLUMECOMPRESSION EnableVolumeCompression;
    29. wstring temp;
    30. wstring temp1;
    31.  
    32.  
    33. //----------------------------------------------------------------------
    34. //
    35. // FormatExCallback
    36. //
    37. // The file system library will call us back with commands that we
    38. // can interpret. If we wanted to halt the chkdsk we could return FALSE.
    39. //
    40. //----------------------------------------------------------------------
    41.  
    42.  
    43.  
    44.  
    45. int
    46. get_next_free_drive_letter_orig(
    47.     char *drv_letter)
    48. {
    49.     DWORD   ret = 0;
    50.     short   index = 25;
    51.    
    52.  
    53.     if (drv_letter == NULL) {
    54.         goto out;
    55.     }
    56.    
    57.     if ((ret = GetLogicalDrives()) != 0) {
    58.         printf("the ret value is %x\n",ret);
    59.         for (index = 25; index >= 0; index--) {
    60.             cout<<"the index is "<<index<<endl;
    61.             if ((1 << index) & ~ret) {
    62.                 drv_letter[0] = (unsigned short)('A' + index);
    63.                 drv_letter[1] = (unsigned short)(':');
    64.                 drv_letter[2] = (unsigned short)('\\');
    65.                 drv_letter[3] = (unsigned short)(0);
    66.                 return 0;
    67.             }
    68.         }
    69.     }
    70.     memset((void *)drv_letter, 0 , 4 * sizeof (char));
    71. out:
    72.     return 0;
    73. }
    74.  
    75. BOOLEAN __stdcall FormatExCallback( CALLBACKCOMMAND Command, DWORD Modifier, PVOID Argument )
    76. {
    77.     PDWORD percent;
    78.     PTEXTOUTPUT output;
    79.     PBOOLEAN status;
    80.     static createStructures = FALSE;
    81.  
    82.     //
    83.     // We get other types of commands, but we don't have to pay attention to them
    84.     //
    85.     switch( Command ) {
    86.  
    87.     case PROGRESS:
    88.         percent = (PDWORD) Argument;
    89.         wprintf(L"%d percent completed.\r", *percent);
    90.         wprintf(L"in progress \n");
    91.         break;
    92.  
    93.     case OUTPUT:
    94.         output = (PTEXTOUTPUT) Argument;
    95.         fprintf(stdout, "%s", output->Output);
    96.         wprintf(L"in output \n");
    97.         break;
    98.  
    99.     case DONE:
    100.         status = (PBOOLEAN) Argument;
    101.         if( *status == FALSE ) {
    102.  
    103.             wprintf(L"FormatEx was unable to complete successfully.\n\n");
    104.             Error = TRUE;
    105.             wprintf(L"in done failure \n");
    106.         } else {
    107.             Error = FALSE; 
    108.             wprintf(L"in done success \n");
    109.         }
    110.         break;
    111.     }
    112.     return TRUE;
    113. }
    114.  
    115.  
    116. //----------------------------------------------------------------------
    117. //
    118. // LoadFMIFSEntryPoints
    119. //
    120. // Loads FMIFS.DLL and locates the entry point(s) we are going to use
    121. //
    122. //----------------------------------------------------------------------
    123. BOOLEAN LoadFMIFSEntryPoints()
    124. {
    125.     LoadLibrary( "fmifs.dll" );
    126.  
    127.     if( !(FormatEx = (PFORMATEX) GetProcAddress( GetModuleHandle( "fmifs.dll"),
    128.             "FormatEx" )) ) {
    129.  
    130.         return FALSE;
    131.     }
    132.  
    133.     if( !(EnableVolumeCompression = (PENABLEVOLUMECOMPRESSION) GetProcAddress( GetModuleHandle( "fmifs.dll"),
    134.             "EnableVolumeCompression" )) ) {
    135.  
    136.         return FALSE;
    137.     }
    138.     return TRUE;
    139. }
    140.  
    141.  
    142.  
    143. wstring str2tstr(const string &src)
    144. {
    145.    
    146.         wchar_t *dest;
    147.         wstring temp;
    148.         if(!src.length()){
    149.             return temp;
    150.         }
    151.         size_t iSize = mbstowcs(NULL, src.c_str(), 0);
    152.         int destSize = (int)((iSize+1)* sizeof(wchar_t));
    153.         dest = (wchar_t *)malloc(destSize);
    154.         iSize = mbstowcs(dest, src.c_str(), iSize+1);
    155.         temp = dest;
    156.         free(dest);
    157.         return temp;
    158. }
    159.  
    160.  
    161.  
    162. int
    163. get_next_free_drive_letter(
    164.     char *drv_letter, vector<const wchar_t *> &ignoreVolumes)
    165. {
    166.     DWORD   ret = 0;
    167.     short   index = 25;
    168.    
    169.  
    170.     if (drv_letter == NULL) {
    171.         goto out;
    172.     }
    173.     UINT mediatype;
    174.     char Target[BUFSIZE];
    175.    
    176.     if ((ret = GetLogicalDrives()) != 0) {
    177.         printf("the ret value is %x\n",ret);
    178.         for (index = 25; index >= 0; index--) {
    179.             cout<<"the index is "<<index<<endl;
    180.             if ((1 << index) & ~ret) {
    181.                 drv_letter[0] = (unsigned short)('A' + index);
    182.                 drv_letter[1] = (unsigned short)(':');
    183.                 drv_letter[2] = (unsigned short)('\\');
    184.                 drv_letter[3] = (unsigned short)(0);
    185.                
    186.             } else {
    187.                 drv_letter[0] = (unsigned short)('A' + index);
    188.                 drv_letter[1] = (unsigned short)(':');
    189.                 drv_letter[2] = (unsigned short)('\\');
    190.                 drv_letter[3] = (unsigned short)(0);
    191.                 mediatype = GetDriveType(drv_letter);
    192.                 if (mediatype == DRIVE_FIXED)
    193.                 {
    194.                     printf("the drive letter is fixed %s \n",drv_letter);
    195.                 }
    196.                 if (mediatype == DRIVE_CDROM)
    197.                 {
    198.                     printf("the drive letter is cdrom %s \n",drv_letter);
    199.                     GetVolumeNameForVolumeMountPoint(drv_letter,    // input volume mount point or directory
    200.                         Target,  // output volume name buffer
    201.                         BUFSIZE  // size of volume name buffer
    202.                     );
    203.                     temp = str2tstr(Target);
    204.                     wprintf(L"we are pushing %s \n",temp.c_str());
    205.                     ignoreVolumes.push_back(temp.c_str());
    206.                     printf("the volume under it is %s \n",Target);
    207.                 }
    208.                 if (mediatype == DRIVE_REMOVABLE)
    209.                 {
    210.                     printf("the drive letter is removable %s \n",drv_letter);
    211.                     GetVolumeNameForVolumeMountPoint(drv_letter,    // input volume mount point or directory
    212.                         Target,  // output volume name buffer
    213.                         BUFSIZE  // size of volume name buffer
    214.                     );
    215.                     temp1 = str2tstr(Target);
    216.                     wprintf(L"we are pushing %s \n",temp1.c_str());
    217.                     ignoreVolumes.push_back(temp1.c_str());
    218.                     printf("the volume under it is %s \n",Target);
    219.                 }
    220.  
    221.             }
    222.         }
    223.     }
    224.     memset((void *)drv_letter, 0 , 4 * sizeof (char));
    225.  
    226.  
    227. out:
    228.     return 0;
    229. }
    230.  
    231.  
    232. void PrintWin32Error( PWCHAR Message, DWORD ErrorCode )
    233.  
    234. {
    235.  
    236. LPVOID lpMsgBuf;
    237.  
    238.  
    239. FormatMessageW( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
    240.  
    241. NULL, ErrorCode,
    242.  
    243. MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
    244.  
    245. (PWCHAR) &lpMsgBuf, 0, NULL );
    246.  
    247. wprintf(L"%s: %s\n", Message, lpMsgBuf );
    248.  
    249. LocalFree( lpMsgBuf );
    250.  
    251. }
    252.  
    253.  
    254.  
    255. // Process each mount point found here. This makes maintenance easier
    256. // than doing it in line. The result indicates whether there is
    257. // another mount point to be scanned.
    258.  
    259. // This routine prints out the path to a mount point and its target.
    260.  
    261. BOOL ProcessVolumeMountPoint (HANDLE hPt,
    262.                               wchar_t *PtBuf, DWORD dwPtBufSize,
    263.                               wchar_t *Buf)
    264. {
    265.    BOOL bFlag;             // Boolean result  
    266.    wchar_t Path[BUFSIZE];    // construct a complete path here
    267.    wchar_t Target[BUFSIZE];  // target of mount at mount point
    268.  
    269.   printf (TEXT("\tVolume mount point found is \"%s\"\n"), PtBuf);
    270.  
    271.    // Detect the volume mounted at the mount point.
    272.  
    273.    // Build a unique path to the mount point.
    274.  
    275.   wcscpy(Path, Buf);
    276.    wcscat(Path, PtBuf);
    277.    wstring pathvar(Path);
    278.    wstring ptbuf(PtBuf);
    279.  
    280.    bFlag = GetVolumeNameForVolumeMountPointW(
    281.              pathvar.c_str(),    // input volume mount point or directory
    282.              Target,  // output volume name buffer
    283.              BUFSIZE  // size of volume name buffer
    284.            );
    285.  
    286.    if (!bFlag)
    287.       printf (TEXT("\tAttempt to get volume name for "
    288.           "%s failed.\n"), Path);
    289.    else
    290.       printf (TEXT("\tTarget of the volume mount point "
    291.           "is %s.\n"), Target);
    292.  
    293.    // Now, either get the next mount point and return it, or return a
    294.    // value indicating there are no more mount points.
    295.  
    296.    bFlag = FindNextVolumeMountPointW(
    297.               hPt,        // handle to scan
    298.               Path,      // pointer to output string
    299.               dwPtBufSize // size of output buffer
    300.            );
    301.   return (bFlag);
    302. }
    303.  
    304. finddiskextents(wchar_t *Buf)
    305. {
    306.     //std::wstring wname(node->fid_objid->vid_name);
    307.     wchar_t MyBuf[4096];
    308.     wcscpy(MyBuf, Buf);
    309.     std::wstring wname(MyBuf);
    310.     char drv_letter[256];
    311.  
    312.     LPDWORD junk;
    313.     DISK_GEOMETRY diskGeometry;
    314.     HANDLE volumeHandle;
    315.    
    316.     MyBuf[wcslen(MyBuf)-1] = '\0';
    317.     wprintf (L"Volume found here is \"%s\".\n", MyBuf);
    318.     try{
    319.  
    320.     volumeHandle = CreateFileW(MyBuf,
    321.                                       GENERIC_READ,
    322.                                       FILE_SHARE_READ | FILE_SHARE_WRITE,
    323.                                       NULL,
    324.                                       OPEN_EXISTING,
    325.                                       FILE_ATTRIBUTE_NORMAL,
    326.                                       NULL);
    327.     } catch(...) {
    328.     return;
    329.     }                            
    330.  
    331.     if (volumeHandle == INVALID_HANDLE_VALUE)
    332.     {
    333.         printf("invalid handle");
    334.         return;
    335.    
    336.     }
    337.    
    338.    
    339.  
    340.     BOOL flag = DeviceIoControl(
    341.     (HANDLE) volumeHandle,            // handle to device
    342.     FSCTL_IS_VOLUME_MOUNTED,     // dwIoControlCode
    343.     NULL,                        // lpInBuffer
    344.     0,                           // nInBufferSize
    345.     NULL,                        // lpOutBuffer
    346.     0,                           // nOutBufferSize
    347.     (LPDWORD) &junk,   // number of bytes returned
    348.     (LPOVERLAPPED) NULL  // OVERLAPPED structure
    349.     );
    350.     if (flag)
    351.         return;
    352.  
    353.     static int MAX_DISK_EXTENTS = 32;
    354.     bool tryagain(true);
    355.     PVOLUME_DISK_EXTENTS extents = 0;
    356.  
    357.     while (tryagain)
    358.     {
    359.         DWORD size = sizeof(((PVOLUME_DISK_EXTENTS)0)->NumberOfDiskExtents);
    360.         size += sizeof(DISK_EXTENT) * MAX_DISK_EXTENTS;
    361.    
    362.         extents = (PVOLUME_DISK_EXTENTS)malloc(size);
    363.    
    364.         if (extents == 0)
    365.         {
    366.             CloseHandle(volumeHandle);
    367.  
    368.         }
    369.  
    370.         memset(extents, 0, size);
    371.    
    372.         //
    373.         // Try to get the extents of the volume, reallocating as needed
    374.         //
    375.         try{
    376.         DWORD bytesReturned;
    377.         BOOL status = DeviceIoControl(volumeHandle,
    378.                                       IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS,
    379.                                       NULL,
    380.                                       0,
    381.                                       extents,
    382.                                       size,
    383.                                       &bytesReturned,
    384.                                       NULL);
    385.         if (status == FALSE)
    386.         { free(extents);
    387.         }
    388.         }
    389.         catch(...)
    390.         {
    391.             PrintWin32Error( L"disk extents with error", GetLastError());
    392.         }
    393.             tryagain = false;
    394.        
    395.     }
    396.  
    397.     CloseHandle(volumeHandle);
    398.  
    399.     try {
    400.     for( DWORD i = 0; i < 1 ; i++ )
    401.     {
    402.         wchar_t subObjName[4096] = {0};
    403.         if (extents->Extents[i].DiskNumber > 4096) {
    404.             return;
    405.         }
    406.         //wprintf(L"\\\\.\\PHYSICALDRIVE%u", extents->Extents[i].DiskNumber);
    407.         swprintf(subObjName,L"\\\\.\\PHYSICALDRIVE%u", extents->Extents[i].DiskNumber);
    408.         if (!wcscmp(subObjName, L"\\\\.\\PHYSICALDRIVE4")) {
    409.             wprintf(L"found the right volume %s and disk %s \n",Buf,subObjName);
    410.             get_next_free_drive_letter_orig(drv_letter);
    411.             wstring temp = str2tstr(drv_letter);
    412.             int result = SetVolumeMountPointW(temp.c_str(),Buf);
    413.             wprintf(L"the drive lettter is \n %s",temp.c_str());
    414.             printf("the result is %d \n",result);
    415.             if( !LoadFMIFSEntryPoints()) {
    416.                 wprintf(L"Could not located FMIFS entry points.\n\n");
    417.  
    418.             }
    419.             wprintf(L"the vol sent to format is %s \n",MyBuf);
    420.  
    421.                 FormatEx(MyBuf, FMIFS_HARDDISK, L"NTFS", L"", TRUE,
    422.                 1024, FormatExCallback);
    423.             PrintWin32Error( L"format with error", GetLastError());
    424.            
    425.         }      
    426.     }
    427.     }
    428.     catch(...) {
    429.         PrintWin32Error( L"printing extents with error", GetLastError());
    430.     }
    431.     free(extents);
    432.     extents = 0;
    433. }
    434.  
    435.  
    436.  
    437.  
    438.  
    439. // Process each volume. This makes maintenance easier than doing it
    440. // in line. The Boolean result indicates whether there is another
    441. // volume to be scanned.
    442.  
    443.  
    444.  
    445. BOOL ProcessVolume (HANDLE hVol, wchar_t *Buf, int iBufSize)
    446. {
    447.    BOOL bFlag;           // generic results flag for return
    448.    HANDLE hPt;           // handle for mount point scan
    449.    wchar_t PtBuf[BUFSIZE]; // string buffer for mount points
    450.    DWORD dwSysFlags;     // flags that describe the file system
    451.    wchar_t FileSysNameBuf[FILESYSNAMEBUFSIZE];
    452.    wchar_t *lpszVolumePathName;
    453.    DWORD cchBufferLength;
    454.    char drv_letter[256];
    455.    vector<const wchar_t *>ignoreVolumes;
    456.    int found = 0;
    457.  
    458.    wprintf (L"Volume found is \"%s\".\n", Buf);
    459.     get_next_free_drive_letter(drv_letter, ignoreVolumes);
    460.     vector<const wchar_t *>::const_iterator itr;
    461.     for (itr = ignoreVolumes.begin(); itr!=ignoreVolumes.end(); itr++)
    462.     {
    463.         wprintf(L"we got from vector guid %s \n",*itr);
    464.         if (!wcscmp(*itr, Buf)) {
    465.             found =1;
    466.             wprintf(L"its floppy drive guid %s \n",*itr);
    467.             printf("found floppy drive \n");
    468.         }
    469.         if (!wcscmp(*itr, Buf)) {
    470.             found = 1;
    471.             wprintf(L"its CDrom drive guid %s\n",*itr);
    472.             printf("found CDrom drive \n");
    473.         }
    474.     }
    475.  
    476.     if (!found)
    477.    finddiskextents(Buf);
    478.  
    479.    wstring buffer(Buf);
    480.    // Determine if this volume uses an NTFS file system.
    481.    GetVolumeInformationW(buffer.c_str(), NULL, 0, NULL, NULL,
    482.                          &dwSysFlags, FileSysNameBuf,
    483.                          FILESYSNAMEBUFSIZE);
    484.  
    485.    // Detect support for reparse points, and therefore for volume
    486.    // mount points, which are implemented using reparse points.
    487.  
    488.    wprintf(L"the filesystem found is  %s \n",FileSysNameBuf);
    489.  
    490.    if (! (dwSysFlags & FILE_SUPPORTS_REPARSE_POINTS))
    491.    {
    492.       wprintf (L"\tThis file system does not support volume mount points.\n");
    493.    }
    494.    else
    495.    {
    496.       // Start processing mount points on this volume.
    497.  
    498.       hPt = FindFirstVolumeMountPointW(
    499.                   Buf, // root path of volume to be scanned
    500.                 PtBuf, // pointer to output string
    501.                BUFSIZE // size of output buffer
    502.             );
    503.  
    504.       if (hPt == INVALID_HANDLE_VALUE)
    505.       {
    506.          wprintf (L"\tNo volume mount points found!\n");
    507.       }
    508.       else
    509.       {
    510.          // Process the volume mount point.
    511.          bFlag = ProcessVolumeMountPoint(hPt,
    512.                                           PtBuf,
    513.                                           BUFSIZE,
    514.                                           Buf);
    515.          wprintf(L"the process volumemount point sent mtpt is %s\n",PtBuf);
    516.  
    517.          // Do while we have volume mount points to process.
    518.          while (bFlag)
    519.             bFlag = ProcessVolumeMountPoint(hPt, PtBuf, BUFSIZE, Buf);
    520.    
    521.          FindVolumeMountPointClose(hPt);
    522.        }
    523.    }
    524.  
    525.   // Stop processing mount points on this volume.
    526.  
    527.    bFlag = FindNextVolumeW(
    528.              hVol,    // handle to scan being conducted
    529.              Buf,     // pointer to output
    530.              iBufSize // size of output buffer
    531.            );
    532.  
    533.    return (bFlag);
    534. }
    535.  
    536. int enumeratevolumes(void)
    537. {
    538.    wchar_t buf[BUFSIZE];      // buffer for unique volume identifiers
    539.    HANDLE hVol;             // handle for the volume scan
    540.    BOOL bFlag;              // generic results flag
    541.  
    542.    // Open a scan for volumes.
    543.    hVol = FindFirstVolumeW(buf, BUFSIZE );
    544.  
    545.    if (hVol == INVALID_HANDLE_VALUE)
    546.    {
    547.      printf (TEXT("No volumes found!\n"));
    548.       return (-1);
    549.    }
    550.  
    551.    // We have a volume; process it.
    552.    bFlag = ProcessVolume (hVol, buf, BUFSIZE);
    553.  
    554.    // Do while we have volumes to process.
    555.    while (bFlag)
    556.    {
    557.       bFlag = ProcessVolume (hVol, buf, BUFSIZE);
    558.    }
    559.  
    560.    // Close out the volume scan.
    561.    bFlag = FindVolumeClose(
    562.               hVol  // handle to be closed
    563.            );
    564.  
    565.    return (bFlag);
    566. }
    567.  
    568.  
    569.  
    570. callmain()
    571. {
    572.  
    573. SET_PARTITION_INFORMATION partinfn;
    574. CREATE_DISK crtdisk;
    575. PARTITION_INFORMATION_EX arraypartinfn_x[1];
    576. PARTITION_INFORMATION arraypartinfn[1];
    577. PARTITION_INFORMATION_EX arraypartinfnout_x[1];
    578.  
    579. DISK_GEOMETRY_EX diskGeometry_x;
    580. BOOL flag;
    581. FORMAT_PARAMETERS *fmtpar;
    582. DISK_GEOMETRY diskGeometry;
    583. LPDWORD lpBytesReturned;
    584. DWORD junk;
    585. DRIVE_LAYOUT_INFORMATION drivelayout;
    586. DRIVE_LAYOUT_INFORMATION_EX drivelayout_x;
    587. DRIVE_LAYOUT_INFORMATION driveoutparam;
    588. DRIVE_LAYOUT_INFORMATION_EX driveoutparam_x;
    589.  
    590. //DISK_DETECTION_INFO disk_detect;
    591.  
    592. //disk_detect
    593. //diskGeometry_x.
    594.  
    595.  
    596. fmtpar = (FORMAT_PARAMETERS *) malloc(sizeof(FORMAT_PARAMETERS));
    597. memset(fmtpar, 0, sizeof(FORMAT_PARAMETERS));
    598. memset(&drivelayout, 0, sizeof(DRIVE_LAYOUT_INFORMATION));
    599.  
    600. HANDLE volumeHandle = CreateFileW(L"\\\\.\\PHYSICALDRIVE4",GENERIC_READ | GENERIC_WRITE ,
    601. FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
    602.  
    603. if (volumeHandle == INVALID_HANDLE_VALUE)
    604. {
    605. cout<<"error in opening device";
    606. }
    607. PrintWin32Error( L"Create file with error", GetLastError());
    608. flag =  DeviceIoControl(
    609.   (HANDLE) volumeHandle,              // handle to device
    610.   IOCTL_DISK_GET_DRIVE_GEOMETRY, // dwIoControlCode
    611.   NULL,                          // lpInBuffer
    612.   0,                             // nInBufferSize
    613.   (LPVOID) &diskGeometry,          // output buffer
    614.   (DWORD) sizeof(diskGeometry),        // size of output buffer
    615.   (LPDWORD) &lpBytesReturned,     // number of bytes returned
    616.   NULL    // OVERLAPPED structure
    617. );
    618.  
    619. PrintWin32Error( L"get geometry with error", GetLastError());
    620. partinfn.PartitionType = PARTITION_FAT32;
    621.  
    622. crtdisk.PartitionStyle = PARTITION_STYLE_MBR;
    623. flag = DeviceIoControl(
    624.   (HANDLE) volumeHandle,              // handle to device
    625.   IOCTL_DISK_CREATE_DISK,        // dwIoControlCode
    626.   (LPVOID) &crtdisk,           // input buffer
    627.   (DWORD) sizeof(CREATE_DISK),         // size of input buffer
    628.   NULL,                          // lpOutBuffer
    629.   0,                             // nOutBufferSize
    630.   (LPDWORD) &lpBytesReturned,     // number of bytes returned
    631.   (LPOVERLAPPED)NULL    // OVERLAPPED structure
    632. );
    633. PrintWin32Error( L"create disk with error ", GetLastError());
    634. cout<<"no of bytes returned is "<<lpBytesReturned;
    635. cout<<flag;
    636.  
    637.  
    638. char * temp = new char[4096];
    639. flag = DeviceIoControl(
    640.   (HANDLE) volumeHandle,            // handle to device
    641.   IOCTL_DISK_GET_DRIVE_LAYOUT_EX, // dwIoControlCode
    642.   NULL,                        // lpInBuffer
    643.   0,                           // nInBufferSize
    644.   (LPVOID) temp,        // output buffer
    645.   (DWORD) 4096,      // size of output buffer
    646.   (LPDWORD) &lpBytesReturned,   // number of bytes returned
    647.   (LPOVERLAPPED) NULL // OVERLAPPED structure
    648. );
    649.  
    650. PrintWin32Error( L"get drive_x layout with error ", GetLastError());
    651. cout<<flag;
    652. DRIVE_LAYOUT_INFORMATION_EX *ptr = (DRIVE_LAYOUT_INFORMATION_EX *)temp;
    653. cout<<"partcount"<<ptr->PartitionCount;
    654. cout<<"signature"<<ptr->Mbr.Signature;
    655. cout<<"partition style"<<ptr->PartitionEntry[0].PartitionStyle;
    656. cout<<"partitiontype "<<ptr->PartitionEntry[0].Mbr.PartitionType;
    657.  
    658.  
    659. arraypartinfn_x[0].PartitionNumber = 1;
    660. arraypartinfn_x[0].RewritePartition = true;
    661. arraypartinfn_x[0].StartingOffset.QuadPart = 0;
    662. arraypartinfn_x[0].PartitionLength.QuadPart = ((((diskGeometry.Cylinders.QuadPart * diskGeometry.TracksPerCylinder)* diskGeometry.SectorsPerTrack)) * diskGeometry.BytesPerSector);
    663. arraypartinfn_x[0].Mbr.BootIndicator = false;
    664. arraypartinfn_x[0].Mbr.RecognizedPartition = true;
    665. arraypartinfn_x[0].Mbr.HiddenSectors = 1;
    666. arraypartinfn_x[0].Mbr.PartitionType = PARTITION_FAT32;
    667. arraypartinfn_x[0].RewritePartition =1;
    668. arraypartinfn_x[0].PartitionStyle = PARTITION_STYLE_MBR;
    669. drivelayout_x.PartitionCount = 1;
    670. drivelayout_x.PartitionEntry[0] = arraypartinfn_x[0];
    671. drivelayout_x.PartitionStyle = PARTITION_STYLE_MBR;
    672. DRIVE_LAYOUT_INFORMATION_MBR mbrlayout;
    673. mbrlayout.Signature = ptr->Mbr.Signature;
    674. drivelayout_x.Mbr = mbrlayout;
    675.  
    676.  
    677.  
    678. flag = DeviceIoControl(
    679.   (HANDLE) volumeHandle,            // handle to device
    680.   IOCTL_DISK_SET_DRIVE_LAYOUT_EX, // dwIoControlCode
    681.   (LPVOID) &drivelayout_x,         // input buffer
    682.   (DWORD) sizeof(DRIVE_LAYOUT_INFORMATION_EX),       // size of input buffer
    683.   NULL,                        // lpOutBuffer
    684.   0,                           // nOutBufferSize
    685.   (LPDWORD) &lpBytesReturned,   // number of bytes returned
    686.   (LPOVERLAPPED) NULL  // OVERLAPPED structure
    687. );
    688.  
    689. PrintWin32Error( L"set drive_x layout with error ", GetLastError());
    690. cout<<flag;
    691.  
    692. VERIFY_INFORMATION verify;
    693. verify.Length = ((((diskGeometry.Cylinders.QuadPart * diskGeometry.TracksPerCylinder)* diskGeometry.SectorsPerTrack)) * diskGeometry.BytesPerSector);
    694. verify.StartingOffset.QuadPart = 0;
    695.  
    696. flag = DeviceIoControl(
    697.   (HANDLE) volumeHandle,            // handle to device
    698.   IOCTL_DISK_VERIFY,           // dwIoControlCode
    699.   (LPVOID) &verify,         // input buffer
    700.   (DWORD) sizeof(VERIFY_INFORMATION),       // size of input buffer
    701.   NULL,                        // lpOutBuffer
    702.   0,                           // nOutBufferSize
    703.   (LPDWORD) &lpBytesReturned,   // number of bytes returned
    704.   (LPOVERLAPPED) NULL  // OVERLAPPED structure
    705. );
    706.  
    707. PrintWin32Error( L"verify disk with error ", GetLastError());
    708. cout<<flag;
    709.  
    710. flag = DeviceIoControl(
    711.   (HANDLE) volumeHandle,            // handle to device
    712.   IOCTL_DISK_UPDATE_PROPERTIES,// dwIoControlCode
    713.   NULL,                        // lpInBuffer
    714.   0,                           // nInBufferSize
    715.   NULL,                        // lpOutBuffer
    716.   0,                           // nOutBufferSize
    717.   (LPDWORD)&lpBytesReturned,    // lpBytesReturned
    718.   (LPOVERLAPPED)NULL       // lpOverlapped
    719. );
    720.  
    721. PrintWin32Error( L"update propertioes with error ", GetLastError());
    722. cout<<flag;
    723.  
    724.  
    725. flag = DeviceIoControl(
    726.   (HANDLE) volumeHandle,            // handle to device
    727.   IOCTL_DISK_UPDATE_PROPERTIES,// dwIoControlCode
    728.   NULL,                        // lpInBuffer
    729.   0,                           // nInBufferSize
    730.   NULL,                        // lpOutBuffer
    731.   0,                           // nOutBufferSize
    732.   (LPDWORD)&lpBytesReturned,    // lpBytesReturned
    733.   (LPOVERLAPPED)NULL       // lpOverlapped
    734. );
    735.  
    736. PrintWin32Error( L"update propertioes with error ", GetLastError());
    737. cout<<flag;
    738.  
    739. CloseHandle(volumeHandle);
    740.  
    741. enumeratevolumes();
    742. }
    743.  
    744. main()
    745. {
    746.     do{
    747.         callmain();
    748.         if (Error)
    749.             Sleep(240000);
    750.     }while(Error);
    751. }
     
  4. iloq

    iloq New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2005
    Сообщения:
    10
    Так в чем проблема? Получай число разделов на диске и информацию о каждом, вычисляй неиспользуемую область на диске и создавай новый раздел.

    P. S. IMHO проще без всяких Windows все делать. Либо из Dos,
    либо с загрузочной дискеты - гораздо проще. Или, в конце концов, если совсем лень, так через WinHex вручную всю эту фигню проделать.
     
  5. MIA2000

    MIA2000 New Member

    Публикаций:
    0
    Регистрация:
    11 мар 2004
    Сообщения:
    9
    Адрес:
    RUSSIA
    Вообщем делаю примерно так, но что-то не работает.... кто подскажет где лажаю?
    Код (Text):
    1. hDeviceOld = CreateFile("\\\\.\\PhysicalDrive0",
    2.         GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE,
    3.         NULL, OPEN_EXISTING, 0, NULL);
    4.     DRIVE_LAYOUT_INFORMATION* lpdlDriveLayoutInfo = NULL;
    5.     lpdlDriveLayoutInfo = (DRIVE_LAYOUT_INFORMATION*)malloc(10);
    6.     BOOL dev = DeviceIoControl(  hDeviceOld, IOCTL_DISK_GET_DRIVE_LAYOUT, NULL, 0, lpdlDriveLayoutInfo, 10, (LPDWORD) &dwRet, NULL);
    7.     int t0 =lpdlDriveLayoutInfo->PartitionEntry[0].RecognizedPartition;
    8.     LONGLONG mysize0 = 0;
    9.     if(t0!=NULL)
    10.     {
    11.         mysize0=lpdlDriveLayoutInfo->PartitionEntry[0].PartitionLength.QuadPart;
    12.     }
    13.     int t1 =lpdlDriveLayoutInfo->PartitionEntry[1].RecognizedPartition;
    14.     if(t1!=NULL)
    15.     {
    16.         mysize0 = mysize0+lpdlDriveLayoutInfo->PartitionEntry[1].PartitionLength.QuadPart;
    17.     }
    18.     int t2 =lpdlDriveLayoutInfo->PartitionEntry[2].RecognizedPartition;
    19.     if(t2!=NULL)
    20.     {
    21.         mysize0 = mysize0+lpdlDriveLayoutInfo->PartitionEntry[2].PartitionLength.QuadPart;
    22.     }
    23.     int t3 =lpdlDriveLayoutInfo->PartitionEntry[3].RecognizedPartition;
    24.     if(t3!=NULL)
    25.     {
    26.         mysize0 = mysize0+lpdlDriveLayoutInfo->PartitionEntry[3].PartitionLength.QuadPart;
    27.     }
    28.  
    29.     DeviceIoControl(
    30.                     hDeviceOld ,
    31.                     IOCTL_DISK_GET_DRIVE_GEOMETRY,
    32.                     NULL,
    33.                     0,
    34.                     (LPVOID) &diskGeometry,
    35.                     (DWORD) sizeof(diskGeometry),
    36.                     (LPDWORD) &lpBytesReturned,
    37.                     NULL
    38.                     );
    39.     LONGLONG fullsizedisk = diskGeometry.Cylinders.QuadPart*diskGeometry.SectorsPerTrack*diskGeometry.TracksPerCylinder*diskGeometry.BytesPerSector;
    40.     LONGLONG emtrysizeondisk = fullsizedisk - mysize0;
    41.  
    42.     lpdlDriveLayoutInfo->PartitionEntry[3].BootIndicator = false;
    43.     lpdlDriveLayoutInfo->PartitionEntry[3].HiddenSectors = lpdlDriveLayoutInfo->PartitionEntry[2].HiddenSectors;
    44.     lpdlDriveLayoutInfo->PartitionEntry[3].PartitionLength.QuadPart = lpdlDriveLayoutInfo->PartitionEntry[2].PartitionLength.QuadPart;
    45.     lpdlDriveLayoutInfo->PartitionEntry[3].PartitionNumber = 5;
    46.     lpdlDriveLayoutInfo->PartitionEntry[3].PartitionType =  lpdlDriveLayoutInfo->PartitionEntry[2].PartitionType;
    47.     lpdlDriveLayoutInfo->PartitionEntry[3].RecognizedPartition = true;
    48.     lpdlDriveLayoutInfo->PartitionEntry[3].RewritePartition = 1;
    49.     lpdlDriveLayoutInfo->PartitionEntry[3].StartingOffset.QuadPart= lpdlDriveLayoutInfo->PartitionEntry[2].StartingOffset.QuadPart;
    50.     lpdlDriveLayoutInfo->PartitionCount = 4;
    51.  
    52.     int tu = 0;
    53.     tu = DeviceIoControl(
    54.         hDeviceOld,            // handle to device
    55.         IOCTL_DISK_SET_DRIVE_LAYOUT, // dwIoControlCode
    56.         &lpdlDriveLayoutInfo,         // input buffer
    57.         (DWORD) sizeof(DRIVE_LAYOUT_INFORMATION),       // size of input buffer
    58.         NULL,                        // lpOutBuffer
    59.         0,                           // nOutBufferSize
    60.         (LPDWORD) &dwRet,
    61.         NULL);
    62.     PrintWin32Error( L"set drive_x layout with error ", GetLastError());
    63.  
    64.     tu = DeviceIoControl(
    65.         hDeviceOld,            // handle to device
    66.         IOCTL_DISK_UPDATE_PROPERTIES,// dwIoControlCode
    67.         NULL,                        // lpInBuffer
    68.         0,                           // nInBufferSize
    69.         NULL,                        // lpOutBuffer
    70.         0,                           // nOutBufferSize
    71.         (LPDWORD)&lpBytesReturned,    // lpBytesReturned
    72.         (LPOVERLAPPED)NULL       // lpOverlapped
    73.         );
    74.  
    75.     PrintWin32Error( L"update propertioes with error ", GetLastError());
    76.  
    77.     tu = DeviceIoControl(
    78.         hDeviceOld,            // handle to device
    79.         IOCTL_DISK_UPDATE_PROPERTIES,// dwIoControlCode
    80.         NULL,                        // lpInBuffer
    81.         0,                           // nInBufferSize
    82.         NULL,                        // lpOutBuffer
    83.         0,                           // nOutBufferSize
    84.         (LPDWORD)&lpBytesReturned,    // lpBytesReturned
    85.         (LPOVERLAPPED)NULL       // lpOverlapped
    86.         );
    87.     PrintWin32Error( L"update propertioes with error ", GetLastError());
    88.  
    89.     CloseHandle(hDeviceOld);