Что нового

Прямое обращение по LBA к SATA диску

Yuriy_V.

Новичок
Сообщения
22
Репутация
0
Добрый день.

Возможно ли с помощью AutoIt реализовать возможность чтения\записи по номеру LBA на SATA диске ?
Например прочитать в буфер информацию с LBA 1 с диска "G:" ?
Сообщение автоматически объединено:

Не ужели никто не знает?
 
Последнее редактирование:

Prog

Продвинутый
Сообщения
537
Репутация
65
Нужен доступ к физическому диску (требуются права администратора).
 
Автор
Y

Yuriy_V.

Новичок
Сообщения
22
Репутация
0
Есть кусок кода на AutoIt?
Я C++ не знаю. ((
Сообщение автоматически объединено:

Собрал из кусков нарытых в интернете скрипт, он читает нужное количество данных. Но стартовая позиция у него начинается с 1 байта NTFS таблицы, а как мне начать чтение именно с 1 байта HDD, может кто подскажет где это подправить в скрипте?
Код:
#RequireAdmin
#include <WinAPI.au3>
#include <Array.au3>

Global  $sDriveLetter = "K" ;Буква диска

Global $LBA, $nBytes, $MFT_Offset, $bytes_to_read, $tBuffer, $hdd_handle, $hFile, $MFTFull

Global $tBuffer=DllStructCreate("byte[512]"),$nBytes
Global $hComIn = _WinAPI_CreateFile("\\.\" & $sDriveLetter & ":",2,2,7)
If $hComIn = 0 then exit

$LBA = 9 ; LBA позиция
_WinAPI_SetFilePointerEx($hComIn, $LBA*512) ; Перемещает указатель на заданный LBA
$read = _WinAPI_ReadFile($hComIn, DllStructGetPtr($tBuffer), 512, $nBytes) ; Читает в буфер 512байт по номеру LBA
If $read = 0 then exit
Global $bRaw = DllStructGetData($tBuffer,1)
_WinAPI_CloseHandle($hComIn)

MsgBox(4096,'',_HexEncode($bRaw),0) ;Структурированный результат прочитанного


Func _HexEncode($bInput)
    Local $tInput = DllStructCreate("byte[" & BinaryLen($bInput) & "]")
    DllStructSetData($tInput, 1, $bInput)
    Local $a_iCall = DllCall("crypt32.dll", "int", "CryptBinaryToString", _
            "ptr", DllStructGetPtr($tInput), _
            "dword", DllStructGetSize($tInput), _
            "dword", 11, _
            "ptr", 0, _
            "dword*", 0)

    If @error Or Not $a_iCall[0] Then
        Return SetError(1, 0, "")
    EndIf

    Local $iSize = $a_iCall[5]
    Local $tOut = DllStructCreate("char[" & $iSize & "]")

    $a_iCall = DllCall("crypt32.dll", "int", "CryptBinaryToString", _
            "ptr", DllStructGetPtr($tInput), _
            "dword", DllStructGetSize($tInput), _
            "dword", 11, _
            "ptr", DllStructGetPtr($tOut), _
            "dword*", $iSize)

    If @error Or Not $a_iCall[0] Then
        Return SetError(2, 0, "")
    EndIf

    Return SetError(0, 0, DllStructGetData($tOut, 1))

EndFunc  ;==>_HexEncode

Func _WinAPI_SetFilePointerEx($hFile, $iPos, $iMethod = 0)
    Local $aResult

    $aResult = DllCall("kernel32.dll", "dword", "SetFilePointerEx", "hwnd", $hFile, "uint64", $iPos, "uint64*", 0, "dword", $iMethod)
    If @error Then Return SetError(1, 0, -1)
    ;If $aResult[0] = $__WINAPCONSTANT_INVALID_SET_FILE_POINTER Then Return SetError(2, 0, -1)
    Return $aResult[0]
EndFunc   ;==>_WinAPI_SetFilePointer
 
Последнее редактирование:

Prog

Продвинутый
Сообщения
537
Репутация
65
кто подскажет где это подправить в скрипте?
Я выше написал что нужно получать доступ к физическому диску и привел пример имени. У вас в коде доступ к логическому диску (буква диска).
Код:
Global  $sDriveLetter = "K" ;Буква диска
 
Автор
Y

Yuriy_V.

Новичок
Сообщения
22
Репутация
0
Я выше написал что нужно получать доступ к физическому диску и привел пример имени. У вас в коде доступ к логическому диску (буква диска).
Разобрался благодаря вашей помощи, всё работает в лучшем виде. Спасибо.
 
Верх