Как использовать ReadFile из kernel32 с NSIS - PullRequest
0 голосов
/ 27 февраля 2020

Я пытаюсь открыть файл и прочитать содержимое в буфере с помощью установщика NSIS. К сожалению, все работает, кроме KERNEL32 :: ReadFile. Я читал, что у многих людей есть проблемы с этим API, и я не могу найти решение.

Вот мой код:

StrCpy $2 $2\TOS.TXT
System::Call 'Kernel32::CreateFile(t, i, i, i, i, i, i) i (r2, 0x80000000, 0, 0, 4, 0x80, 0) .r3' 
System::Call 'kernel32::GetFileSize(pr3, p0)i.r7' ; Call API to read 32-bit file size
System::Call "kernel32::VirtualAlloc(i0, ir7, i0x3000, i0x40) .r1"
System::Call "KERNEL32::ReadFile(pr3,pr1,ir7,*i,p0)i.r3"

Файл хорошо открыт и буфер хорошо создан с правильным размером.

Любая помощь приветствуется, спасибо, Крис.

1 Ответ

0 голосов
/ 27 февраля 2020

В вашем вызове VirtualAlloc отсутствует тип вывода до .r1.

Нет необходимости использовать системный плагин только для чтения из простого файла.

!macro MakeTestFile
FileOpen $0 "$temp\nsis_test.txt" w
FileWrite $0 "Hello$\nWorld!"
FileClose $0
!macroend


StrCpy $9 "$temp\nsis_test.txt"

!insertmacro MakeTestFile
FileOpen $0 "$9" r
FileRead $0 $1 ; Line 1
FileRead $0 $2 ; Line 2
FileClose $0
MessageBox MB_OK $1$2

!insertmacro MakeTestFile
FileOpen $0 "$9" r
FileSeek $0 1 SET
FileReadByte $0 $1
FileClose $0
IntFmt $1 "0x%.2X" $1
MessageBox MB_OK "Byte #2 is $1"

!insertmacro MakeTestFile
System::Call 'KERNEL32::CreateFile(t, i, i, p, i, i, p) p (r9, 0x80000000, 0, 0, 4, 0x80, 0) .r3' 
System::Call 'KERNEL32::GetFileSize(pr3, p0)i.r7'
System::Call "KERNEL32::VirtualAlloc(p0, pr7, i0x3000, i0x40)p.r1"
System::Call "KERNEL32::ReadFile(pr3,pr1,ir7,*i,p0)i.r3"
System::Call "USER32::MessageBoxA(p$hwndparent,pr1,t 'System::Call',i0)"
System::Call "KERNEL32::VirtualFree(pr1,p0,i0x8000)"

Системный плагин также имеет System :: Alloc / StrAlloc / Free, поэтому нет необходимости вызывать VirtualAlloc напрямую, если вам нужна память.

...