激情五月天婷婷,亚洲愉拍一区二区三区,日韩视频一区,a√天堂中文官网8

<ul id="buwfs"><strike id="buwfs"><strong id="buwfs"></strong></strike></ul>
    <output id="buwfs"></output>
  • <dfn id="buwfs"><source id="buwfs"></source></dfn>
      <dfn id="buwfs"><td id="buwfs"></td></dfn>
      <div id="buwfs"><small id="buwfs"></small></div>
      <dfn id="buwfs"><source id="buwfs"></source></dfn>
      1. <dfn id="buwfs"><td id="buwfs"></td></dfn>
        始創(chuàng)于2000年 股票代碼:831685
        咨詢熱線:0371-60135900 注冊有禮 登錄
        • 掛牌上市企業(yè)
        • 60秒人工響應(yīng)
        • 99.99%連通率
        • 7*24h人工
        • 故障100倍補償
        全部產(chǎn)品
        您的位置: 網(wǎng)站首頁 > 幫助中心>文章內(nèi)容

        windows的磁盤操作之二——初始化磁盤

        發(fā)布時間:  2012/9/11 19:39:50

          上一節(jié)中我們介紹了一些基本概念和主要的API,本節(jié)開始我們將列舉并分析一些實例。本文中的所有代碼我都在vs2008下測試過,讀者只需要替換少量的宏定義即可編譯執(zhí)行。
          面對一塊新的磁盤,我們首先要做的就是對其初始化。在系統(tǒng)中通過windows的磁盤管理完成這一點非常容易,但在程序中實現(xiàn)略微復(fù)雜。本節(jié)的示例代碼對一塊新硬盤初始化,并在上面創(chuàng)建分區(qū)。
          代碼如下:
          /******************************************************************************
          * Function: initialize the disk and create partitions
          * input: disk, disk name
          *        parNum, partition number
          * output: N/A
          * return: Succeed, 0
          *         Fail, -1
          ******************************************************************************/
          DWORD CreateDisk(DWORD disk, WORD partNum)
          {
          HANDLE hDevice;               // handle to the drive to be examined
          BOOL result;                  // results flag
          DWORD readed;                 // discard results
          DWORD ret;
          WORD i;
          CHAR diskPath[DISK_PATH_LEN];
          DISK_GEOMETRY pdg;
          DWORD sectorSize;
          DWORD signature;
          LARGE_INTEGER diskSize;
          LARGE_INTEGER partSize;
          BYTE actualPartNum;
          DWORD layoutStructSize;
          DRIVE_LAYOUT_INFORMATION_EX *dl;
          CREATE_DISK newDisk;
          sprintf(diskPath, "\\\\.\\PhysicalDrive%d", disk);
          actualPartNum = 4;
          if (partNum > actualPartNum)
          {
          return (WORD)-1;
          }
          hDevice = CreateFile(
          diskPath,
          GENERIC_READ|GENERIC_WRITE,
          FILE_SHARE_READ|FILE_SHARE_WRITE,
          NULL,           //default security attributes
          OPEN_EXISTING, // disposition
          0,              // file attributes
          NULL
          );
          if (hDevice == INVALID_HANDLE_VALUE) // cannot open the drive
          {
          fprintf(stderr, "CreateFile() Error: %ld ", GetLastError());
          return DWORD(-1);
          }
          // Create primary partition MBR
          newDisk.PartitionStyle = PARTITION_STYLE_MBR;
          signature = (DWORD)time(NULL);     //get signature from current time
          newDisk.Mbr.Signature = signature;
          result = DeviceIoControl(
          hDevice,
          IOCTL_DISK_CREATE_DISK,
          &newDisk,
          sizeof(CREATE_DISK),
          NULL,
          0,
          &readed,
          NULL
         。;
          if (!result)
          {
          fprintf(stderr, "IOCTL_DISK_CREATE_DISK Error: %ld ", GetLastError());
          (void)CloseHandle(hDevice);
          return DWORD(-1);
          }
          //fresh the partition table
          result = DeviceIoControl(
          hDevice,
          IOCTL_DISK_UPDATE_PROPERTIES,
          NULL,
          0,
          NULL,
          0,
          &readed,
          NULL
         。;
          if (!result)
          {
          fprintf(stderr, "IOCTL_DISK_UPDATE_PROPERTIES Error: %ld ", GetLastError());
          (void)CloseHandle(hDevice);
          return DWORD(-1);
          }
          //Now create the partitions
          ret = GetDriveGeometry(diskPath, &pdg);
          if ((DWORD)-1 == ret)
          {
          return ret;
          }
          sectorSize = pdg.BytesPerSector;
          diskSize.QuadPart = pdg.Cylinders.QuadPart * pdg.TracksPerCylinder *
          pdg.SectorsPerTrack * pdg.BytesPerSector;       //calculate the disk size;
          partSize.QuadPart = diskSize.QuadPart / partNum;
          layoutStructSize = sizeof(DRIVE_LAYOUT_INFORMATION_EX) + (actualPartNum - 1) * sizeof(PARTITION_INFORMATION_EX);
          dl = (DRIVE_LAYOUT_INFORMATION_EX*)malloc(layoutStructSize);
          if (NULL == dl)
          {
         。╲oid)CloseHandle(hDevice);
          return (WORD)-1;
          }
          dl->PartitionStyle = (DWORD)PARTITION_STYLE_MBR;
          dl->PartitionCount = actualPartNum;
          dl->Mbr.Signature = signature;
          //clear the unused partitions
          for (i = 0; i < actualPartNum; i++){
          dl->PartitionEntry[i].RewritePartition = 1;
          dl->PartitionEntry[i].Mbr.PartitionType = PARTITION_ENTRY_UNUSED;
          }
          //set the profile of the partitions
          for (i = 0; i < partNum; i++){
          dl->PartitionEntry[i].PartitionStyle = PARTITION_STYLE_MBR;
          dl->PartitionEntry[i].StartingOffset.QuadPart =
          (partSize.QuadPart * i) + ((LONGLONG)(pdg.SectorsPerTrack) * (LONGLONG)(pdg.BytesPerSector));   //32256
          dl->PartitionEntry[i].PartitionLength.QuadPart = partSize.QuadPart;
          dl->PartitionEntry[i].PartitionNumber = i + 1;
          dl->PartitionEntry[i].RewritePartition = TRUE;
          dl->PartitionEntry[i].Mbr.PartitionType = PARTITION_IFS;
          dl->PartitionEntry[i].Mbr.BootIndicator = FALSE;
          dl->PartitionEntry[i].Mbr.RecognizedPartition = TRUE;
          dl->PartitionEntry[i].Mbr.HiddenSectors =
          pdg.SectorsPerTrack + (DWORD)((partSize.QuadPart / sectorSize) * i);
          }
          //execute the layout
          result = DeviceIoControl(
          hDevice,
          IOCTL_DISK_SET_DRIVE_LAYOUT_EX,
          dl,
          layoutStructSize,
          NULL,
          0,
          &readed,
          NULL
         。;
          if (!result)
          {
          fprintf(stderr, "IOCTL_DISK_SET_DRIVE_LAYOUT_EX Error: %ld ", GetLastError());
          free(dl);
         。╲oid)CloseHandle(hDevice);
          return DWORD(-1);
          }
          //fresh the partition table
          result = DeviceIoControl(
          hDevice,
          IOCTL_DISK_UPDATE_PROPERTIES,
          NULL,
          0,
          NULL,
          0,
          &readed,
          NULL
         。;
          if (!result)
          {
          fprintf(stderr, "IOCTL_DISK_UPDATE_PROPERTIES Error: %ld ", GetLastError());
          free(dl);
          (void)CloseHandle(hDevice);
          return DWORD(-1);
          }
          free(dl);
         。╲oid)CloseHandle(hDevice);
          Sleep(3000);            //wait the operations take effect
          return 0;
          }
          函數(shù)CreateDisk包含兩個參數(shù),
          DWORD disk 填入物理驅(qū)動器號,參見第一節(jié)。
          WORD partNum 表示需要創(chuàng)建的分區(qū)數(shù),partNum <= 4。
          函數(shù)的執(zhí)行流程解釋如下:
          /***************初始化磁盤*****************/
          1. 根據(jù)disk創(chuàng)建設(shè)備名稱,\\\\.\\PhysicalDriveX,這里由于要轉(zhuǎn)義,所以”\”都寫為”\\”。
          2. 調(diào)用CreateFile打開設(shè)備文件,并獲得句柄。
          3. 用操作碼IOCTL_DISK_CREATE_DISK調(diào)用DeviceIoControl函數(shù),初始化磁盤并創(chuàng)建分區(qū)表。
          使用IOCTL_DISK_CREATE_DISK操作碼時,lpInBuffer要填入一個CREATE_DISK結(jié)構(gòu)參數(shù),其中包括分區(qū)表類型和磁盤簽名等參數(shù),詳見MSDN。本例中創(chuàng)建MBR分區(qū)表,簽名由當前時間產(chǎn)生。
          4. 刷新分區(qū)表。注意,程序中任何時候?qū)Υ疟P的分區(qū)信息進行了修改都需要調(diào)用操作碼為IOCTL_DISK_UPDATE_PROPERTIES的DeviceIoControl函數(shù)來刷新分區(qū)表,是操作切實生效。
          /****************創(chuàng)建分區(qū)*******************/
          5. 調(diào)用GetDriveGeometry獲取磁盤信息(GetDriveGeometry參見上一節(jié))。由于創(chuàng)建分區(qū)時要填入分區(qū)大小信息,我們此處先計算磁盤總大小,然后除以partNum將字節(jié)數(shù)平均分配到各個分區(qū)。
          6. 分配DRIVE_LAYOUT_INFORMATION_EX結(jié)構(gòu)體空間。我們通過在這個結(jié)構(gòu)體中填入數(shù)據(jù)來指定如何對硬盤進行分區(qū)。結(jié)構(gòu)體定義如下
          typedef struct _DRIVE_LAYOUT_INFORMATION_EX {
          DWORD PartitionStyle;
          DWORD PartitionCount;
          union {
          DRIVE_LAYOUT_INFORMATION_MBR Mbr;
          DRIVE_LAYOUT_INFORMATION_GPT Gpt;
          };
          PARTITION_INFORMATION_EX PartitionEntry[1];
          } DRIVE_LAYOUT_INFORMATION_EX,
          *PDRIVE_LAYOUT_INFORMATION_EX;
          其中PartitionCount為4的倍數(shù),為簡化處理,我們這里定死為4。
          另外還要注意PARTITION_INFORMATION_EX型的數(shù)組PartitionEntry[1]。雖然結(jié)構(gòu)體中只定義了一個元素,但事實上必須在其后補足PartitionCount – 1個元素。所以代碼中為DRIVE_LAYOUT_INFORMATION_EX *dl分配空間的時候加上了(actualPartNum - 1) * sizeof(PARTITION_INFORMATION_EX)。
          7. 在DRIVE_LAYOUT_INFORMATION_EX結(jié)構(gòu)體空間dl中填入數(shù)據(jù)。
          先將所有分區(qū)都設(shè)為PARTITION_ENTRY_UNUSED,后面具體分配多少個分區(qū)再設(shè)置回來。
          然后再循環(huán)體內(nèi)對每個分區(qū)的PartitionEntry賦值,其中
          StartingOffset除了跳過前面的分區(qū)已占據(jù)的空間外,還要加上63個扇區(qū)空間(32256字節(jié))。
          PartitionNumber從1開始。
          Mbr.PartitionType = PARTITION_IFS表示NTFS格式。
          Mbr.HiddenSectors MSDN上說The number of hidden sectors to be allocated when the partition table is created. 我理解得不是很深刻,歡迎補充。
          8. 調(diào)用操作碼為IOCTL_DISK_SET_DRIVE_LAYOUT_EX的DeviceIoControl函數(shù)執(zhí)行分區(qū),參數(shù)需要填入剛才準備好的DRIVE_LAYOUT_INFORMATION_EX結(jié)構(gòu)體和大小。
          9. 刷新分區(qū)表,原理同4。
          另外,我在函數(shù)末尾加上了Sleep(3000)。這是因為我發(fā)現(xiàn)創(chuàng)建分區(qū)操作需要一定的執(zhí)行時間,如果后續(xù)緊跟著其它相關(guān)操作(例如格式化該分區(qū))可能會產(chǎn)生分區(qū)不存在的錯誤,所以此處等待3秒確保其執(zhí)行完畢。

        億恩科技地址(ADD):鄭州市黃河路129號天一大廈608室 郵編(ZIP):450008 傳真(FAX):0371-60123888
           聯(lián)系:億恩小凡
           QQ:89317007
           電話:0371-63322206


        本文出自:億恩科技【mszdt.com】

        服務(wù)器租用/服務(wù)器托管中國五強!虛擬主機域名注冊頂級提供商!15年品質(zhì)保障!--億恩科技[ENKJ.COM]

      2. 您可能在找
      3. 億恩北京公司:
      4. 經(jīng)營性ICP/ISP證:京B2-20150015
      5. 億恩鄭州公司:
      6. 經(jīng)營性ICP/ISP/IDC證:豫B1.B2-20060070
      7. 億恩南昌公司:
      8. 經(jīng)營性ICP/ISP證:贛B2-20080012
      9. 服務(wù)器/云主機 24小時售后服務(wù)電話:0371-60135900
      10. 虛擬主機/智能建站 24小時售后服務(wù)電話:0371-60135900
      11. 專注服務(wù)器托管17年
        掃掃關(guān)注-微信公眾號
        0371-60135900
        Copyright© 1999-2019 ENKJ All Rights Reserved 億恩科技 版權(quán)所有  地址:鄭州市高新區(qū)翠竹街1號總部企業(yè)基地億恩大廈  法律顧問:河南亞太人律師事務(wù)所郝建鋒、杜慧月律師   京公網(wǎng)安備41019702002023號
          0
         
         
         
         

        0371-60135900
        7*24小時客服服務(wù)熱線