在 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);