在 Inno Setup Pascal 脚本中访问 PAnsiChar 指向的内存
Accessing memory pointed to by PAnsiChar in Inno Setup Pascal Script
需要使用 Win32 加密 API 在传递给子进程之前将密码转换为加密的 blob。
正在尝试使用 CryptProtectData@crypt32.dll
API 来执行加密。
函数returning成功。但是我在访问 returned 加密的 blob 时遇到了问题。
试图使用 StrPas()
将 PAnsiChar
转换为 AnsiString
,但出现 "Invalid identifier" 错误。
const
CRYPTPROTECT_LOCAL_MACHINE = ;
type
DataBlob = record
cbData: Longword;
pbData: PAnsiChar;
end;
function CryptProtectData(var pDataIn: DataBlob;
szDataDescr, pOptionalEntropy, pvReserved, pPromptStruct : DWORD;
dwFlags: DWORD; var pDataOut: DataBlob): Boolean;
external 'CryptProtectData@crypt32.dll stdcall delayload';
var
Password: AnsiString;
function Encrypt(): Boolean;
var
DataBlobIn, DataBlobOut: DataBlob
EncryptStr: AnsiString;
begin
DataBlobIn.cbData := Length(Password);
DataBlobIn.pbData := Password;
if CryptProtectData(DataBlobIn, 0, 0, 0, 0, CRYPTPROTECT_LOCAL_MACHINE, DataBlobOut) then
begin
Log('Success');
{ Using StrPas gives an 'unknown identifier error' }
EncryptStr := StrPas(DataBlobOut.pbData);
end;
end;
return 内存块的大小是 DataBlobOut.cbData
,
但是如何访问return在DataBlobOut.pbData
中编辑的内存块?
能否请您指出一些示例代码,我们可以在其中访问长度为 X 的内存?
要将数据从内存指针复制到 Inno Setup buffer-like 变量(例如 AnsiString
),您可以使用 RtlMoveMemory
WinAPI function:
procedure RtlMoveMemory(Dest: AnsiString; Source: PAnsiChar; Len: Integer);
external 'RtlMoveMemory@kernel32.dll stdcall';
您可以像这样使用它:
{ Allocate memory }
SetLength(EncryptStr, DataBlobOut.cbData);
{ Copy data }
RtlMoveMemory(EncryptStr, DataBlobOut.pbData, DataBlobOut.cbData);
需要使用 Win32 加密 API 在传递给子进程之前将密码转换为加密的 blob。
正在尝试使用 CryptProtectData@crypt32.dll
API 来执行加密。
函数returning成功。但是我在访问 returned 加密的 blob 时遇到了问题。
试图使用 StrPas()
将 PAnsiChar
转换为 AnsiString
,但出现 "Invalid identifier" 错误。
const
CRYPTPROTECT_LOCAL_MACHINE = ;
type
DataBlob = record
cbData: Longword;
pbData: PAnsiChar;
end;
function CryptProtectData(var pDataIn: DataBlob;
szDataDescr, pOptionalEntropy, pvReserved, pPromptStruct : DWORD;
dwFlags: DWORD; var pDataOut: DataBlob): Boolean;
external 'CryptProtectData@crypt32.dll stdcall delayload';
var
Password: AnsiString;
function Encrypt(): Boolean;
var
DataBlobIn, DataBlobOut: DataBlob
EncryptStr: AnsiString;
begin
DataBlobIn.cbData := Length(Password);
DataBlobIn.pbData := Password;
if CryptProtectData(DataBlobIn, 0, 0, 0, 0, CRYPTPROTECT_LOCAL_MACHINE, DataBlobOut) then
begin
Log('Success');
{ Using StrPas gives an 'unknown identifier error' }
EncryptStr := StrPas(DataBlobOut.pbData);
end;
end;
return 内存块的大小是 DataBlobOut.cbData
,
但是如何访问return在DataBlobOut.pbData
中编辑的内存块?
能否请您指出一些示例代码,我们可以在其中访问长度为 X 的内存?
要将数据从内存指针复制到 Inno Setup buffer-like 变量(例如 AnsiString
),您可以使用 RtlMoveMemory
WinAPI function:
procedure RtlMoveMemory(Dest: AnsiString; Source: PAnsiChar; Len: Integer);
external 'RtlMoveMemory@kernel32.dll stdcall';
您可以像这样使用它:
{ Allocate memory }
SetLength(EncryptStr, DataBlobOut.cbData);
{ Copy data }
RtlMoveMemory(EncryptStr, DataBlobOut.pbData, DataBlobOut.cbData);