我的P/Invoke WriteProcessMemory
方法目前看起來是這樣的:發送空值終止字符串通過P字節數組WriteProcessMemory的()/調用
[DllImport("kernel32", SetLastError = true)]
[return : MarshalAs(UnmanagedType.Bool)]
static extern bool WriteProcessMemory(
IntPtr hProcess,
IntPtr baseAddress,
byte[] bufferToWrite,
uint numBytesToWrite,
out IntPtr numBytesWritten
);
我需要一個字符串發送到bufferToWrite
參數,但它需要byte[]
所以我把它轉換成byte[]
之前通過它。
我的問題是,因爲.NET字符串不是空終止,它不會寫入終止null到遠程內存。如果我在非託管代碼中執行此操作,我將分配字符串的長度+終止空值,並將所有內容放入分配的內存中,因爲我正在讀取的「字符串」包含空值。但是託管字符串不包含它。也許我可以分配一個足夠大的緩衝區來包含終止空值,然後再次調用WriteProcessMemory
來寫入空值;或者我可以創建一個足以容納字符串+ null的byte[]
,寫入數組並將其傳入。
但是,有沒有一個更優雅的解決這個問題?
如果我這樣做,應該'numBytesToWrite'考慮終止空字節,儘管目前很多字節不會存在於clr字符串中? – eurotrash
編組器會將'string'編組爲一個指向以null結尾的字符數組的指針。你可以並且應該在numBytesToWrite –
中說明空終止符。好極了,這正是我正在尋找的解決方案。 – eurotrash