Advertisement
AZJIO

DiskPart ACTIVE

Sep 20th, 2013
668
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
AutoIt 4.09 KB | None | 0 0
  1. #include <File.au3>
  2.  
  3. $aDrive = _GetDiskNimberForDrive('H:') ; Возвращает номера  дисков и разделов
  4. If @error Then Exit MsgBox(0, 'Сообщение', 'Ошибка')
  5. __DiskPart_DriveActive($aDrive[0], $aDrive[1], 1)
  6. If @error Then Exit MsgBox(0, 'Сообщение', 'Ошибка, не удалось создать сценарий для DiskPart')
  7.  
  8. ; Включает или выключает активность диска
  9. ; $iDisk - Номер диска
  10. ; $iPartition - Номер раздела
  11. ; $iActive - Включает или выключает активность. 1 - Активный, или 0 - Не автивный
  12. Func __DiskPart_DriveActive($iDisk, $iPartition, $iActive = 1)
  13.     Local $sScript, $sDskPrt_Script, $hFile
  14.     If $iActive Then
  15.         $sActive = 'Active'
  16.     Else
  17.         $sActive = 'Inactive'
  18.     EndIf
  19.    
  20.     $sScript = _
  21.         'Select Disk=' & $iDisk &@CRLF& _
  22.         'Select Partition=' & $iPartition &@CRLF& _
  23.         $sActive &@CRLF& _
  24.         'exit'
  25.  
  26.     $sDskPrt_Script = _TempFile()
  27.    
  28.     $hFile = FileOpen($sDskPrt_Script, 2)
  29.     If $hFile = -1 Then Return SetError(1, 0, 'Error')
  30.     If Not FileWrite($hFile, $sScript) Then Return SetError(1, 0, 'Error')
  31.     FileClose($hFile)
  32.    
  33.     RunWait(@ComSpec & ' /c (Title DiskPart & @Echo off & Color 1e & cls & Diskpart /s "' & $sDskPrt_Script & '" & set /p Ok=^>^>)')
  34.     ; RunWait('Diskpart /s "' & $sDskPrt_Script & '">"' & @ScriptDir & '\out.txt"', '', @SW_HIDE)
  35.     ; RunWait('Diskpart /s "' & $sDskPrt_Script & '"', '', @SW_HIDE)
  36.     FileDelete($sDskPrt_Script)
  37. EndFunc
  38.  
  39. ; http://www.autoitscript.com/forum/topic/91598-get-disk-number-from-drive-letter/?p=659721
  40. ; Описание ........: Возвращает номер диска и номер раздела в формате n:n (<номер диска>:<номер раздела>)
  41. ; Параметры:
  42. ;       $sDriveLetter - Буква диска с двоеточием, например C:
  43. ;                   Неудачно , возвращает -1, @error:
  44. ;                  |1 - Ошибка CreateFile, ваша система очень старая
  45. ;                  |2 - Диск не существует
  46. ;                  |3 - Неудачный вызов DeviceIoControl
  47. ;                  |4 - Не раздела диска
  48. Func _GetDiskNimberForDrive($sDriveLetter) ; Буква диска
  49.  
  50.     Local $aDrive[2] = ['?', '?']
  51.  
  52.     Local $a_hCall = DllCall("kernel32.dll", "hwnd", "CreateFile", _
  53.             "str", "\\.\" & $sDriveLetter, _; Буква диска
  54.             "dword", 0, _
  55.             "dword", 0, _
  56.             "ptr", 0, _
  57.             "dword", 3, _; OPEN_EXISTING
  58.             "dword", 128, _; FILE_ATTRIBUTE_NORMAL
  59.             "ptr", 0)
  60.  
  61.     If @error Then
  62.         Return SetError(1, 0, $aDrive); Ваша система очень старая. Сделайте что-нибудь.
  63.     EndIf
  64.  
  65.     If $a_hCall[0] = -1 Then
  66.         Return SetError(2, 0, $aDrive) ; Диск не существует
  67.     EndIf
  68.  
  69.     Local $hDevice = $a_hCall[0]
  70.  
  71.     Local $tIOCTL_STORAGE_GET_DEVICE_NUMBER = DllStructCreate("dword DeviceType;" & _
  72.             "dword DeviceNumber;" & _
  73.             "int PartitionNumber")
  74.  
  75.     Local $a_iCall = DllCall("kernel32.dll", "int", "DeviceIoControl", _
  76.             "hwnd", $hDevice, _
  77.             "dword", 0x2D1080, _; IOCTL_STORAGE_GET_DEVICE_NUMBER
  78.             "ptr", 0, _
  79.             "dword", 0, _
  80.             "ptr", DllStructGetPtr($tIOCTL_STORAGE_GET_DEVICE_NUMBER), _
  81.             "dword", DllStructGetSize($tIOCTL_STORAGE_GET_DEVICE_NUMBER), _
  82.             "dword*", 0, _
  83.             "ptr", 0)
  84.  
  85.     If @error Or Not $a_hCall[0] Then
  86.         DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hDevice)
  87.         Return SetError(3, 0, $aDrive); неудачный вызов DeviceIoControl
  88.     EndIf
  89.  
  90.     DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hDevice)
  91.  
  92.     If DllStructGetData($tIOCTL_STORAGE_GET_DEVICE_NUMBER, "DeviceType") = 7 Then; FILE_DEVICE_DISK
  93.         $aDrive[0] = DllStructGetData($tIOCTL_STORAGE_GET_DEVICE_NUMBER, "DeviceNumber")
  94.         $aDrive[1] = DllStructGetData($tIOCTL_STORAGE_GET_DEVICE_NUMBER, "PartitionNumber")
  95.         Return SetError(0, 0, $aDrive)
  96.     EndIf
  97.  
  98.     Return SetError(4, 0, $aDrive); Не раздела диска
  99.  
  100. EndFunc   ;==>_GetDiskNimberForDrive
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement