Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <File.au3>
- $aDrive = _GetDiskNimberForDrive('H:') ; Возвращает номера дисков и разделов
- If @error Then Exit MsgBox(0, 'Сообщение', 'Ошибка')
- __DiskPart_DriveActive($aDrive[0], $aDrive[1], 1)
- If @error Then Exit MsgBox(0, 'Сообщение', 'Ошибка, не удалось создать сценарий для DiskPart')
- ; Включает или выключает активность диска
- ; $iDisk - Номер диска
- ; $iPartition - Номер раздела
- ; $iActive - Включает или выключает активность. 1 - Активный, или 0 - Не автивный
- Func __DiskPart_DriveActive($iDisk, $iPartition, $iActive = 1)
- Local $sScript, $sDskPrt_Script, $hFile
- If $iActive Then
- $sActive = 'Active'
- Else
- $sActive = 'Inactive'
- EndIf
- $sScript = _
- 'Select Disk=' & $iDisk &@CRLF& _
- 'Select Partition=' & $iPartition &@CRLF& _
- $sActive &@CRLF& _
- 'exit'
- $sDskPrt_Script = _TempFile()
- $hFile = FileOpen($sDskPrt_Script, 2)
- If $hFile = -1 Then Return SetError(1, 0, 'Error')
- If Not FileWrite($hFile, $sScript) Then Return SetError(1, 0, 'Error')
- FileClose($hFile)
- RunWait(@ComSpec & ' /c (Title DiskPart & @Echo off & Color 1e & cls & Diskpart /s "' & $sDskPrt_Script & '" & set /p Ok=^>^>)')
- ; RunWait('Diskpart /s "' & $sDskPrt_Script & '">"' & @ScriptDir & '\out.txt"', '', @SW_HIDE)
- ; RunWait('Diskpart /s "' & $sDskPrt_Script & '"', '', @SW_HIDE)
- FileDelete($sDskPrt_Script)
- EndFunc
- ; http://www.autoitscript.com/forum/topic/91598-get-disk-number-from-drive-letter/?p=659721
- ; Описание ........: Возвращает номер диска и номер раздела в формате n:n (<номер диска>:<номер раздела>)
- ; Параметры:
- ; $sDriveLetter - Буква диска с двоеточием, например C:
- ; Неудачно , возвращает -1, @error:
- ; |1 - Ошибка CreateFile, ваша система очень старая
- ; |2 - Диск не существует
- ; |3 - Неудачный вызов DeviceIoControl
- ; |4 - Не раздела диска
- Func _GetDiskNimberForDrive($sDriveLetter) ; Буква диска
- Local $aDrive[2] = ['?', '?']
- Local $a_hCall = DllCall("kernel32.dll", "hwnd", "CreateFile", _
- "str", "\\.\" & $sDriveLetter, _; Буква диска
- "dword", 0, _
- "dword", 0, _
- "ptr", 0, _
- "dword", 3, _; OPEN_EXISTING
- "dword", 128, _; FILE_ATTRIBUTE_NORMAL
- "ptr", 0)
- If @error Then
- Return SetError(1, 0, $aDrive); Ваша система очень старая. Сделайте что-нибудь.
- EndIf
- If $a_hCall[0] = -1 Then
- Return SetError(2, 0, $aDrive) ; Диск не существует
- EndIf
- Local $hDevice = $a_hCall[0]
- Local $tIOCTL_STORAGE_GET_DEVICE_NUMBER = DllStructCreate("dword DeviceType;" & _
- "dword DeviceNumber;" & _
- "int PartitionNumber")
- Local $a_iCall = DllCall("kernel32.dll", "int", "DeviceIoControl", _
- "hwnd", $hDevice, _
- "dword", 0x2D1080, _; IOCTL_STORAGE_GET_DEVICE_NUMBER
- "ptr", 0, _
- "dword", 0, _
- "ptr", DllStructGetPtr($tIOCTL_STORAGE_GET_DEVICE_NUMBER), _
- "dword", DllStructGetSize($tIOCTL_STORAGE_GET_DEVICE_NUMBER), _
- "dword*", 0, _
- "ptr", 0)
- If @error Or Not $a_hCall[0] Then
- DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hDevice)
- Return SetError(3, 0, $aDrive); неудачный вызов DeviceIoControl
- EndIf
- DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hDevice)
- If DllStructGetData($tIOCTL_STORAGE_GET_DEVICE_NUMBER, "DeviceType") = 7 Then; FILE_DEVICE_DISK
- $aDrive[0] = DllStructGetData($tIOCTL_STORAGE_GET_DEVICE_NUMBER, "DeviceNumber")
- $aDrive[1] = DllStructGetData($tIOCTL_STORAGE_GET_DEVICE_NUMBER, "PartitionNumber")
- Return SetError(0, 0, $aDrive)
- EndIf
- Return SetError(4, 0, $aDrive); Не раздела диска
- EndFunc ;==>_GetDiskNimberForDrive
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement