Kernel
Код:
PROCEDURE AllocModMem* (descSize, modSize: INTEGER; VAR descAdr, modAdr: INTEGER);
VAR res: INTEGER;
BEGIN
descAdr := WinApi.VirtualAlloc(0, descSize, {12, 13}, {6}); (* reserve & commit; exec, read, write *)
IF descAdr # 0 THEN
modAdr := WinApi.VirtualAlloc(0, modSize, {12, 13}, {6}); (* reserve & commit; exec, read, write *)
IF modAdr # 0 THEN INC(used, descSize + modSize)
ELSE res := WinApi.VirtualFree(descAdr, 0, {15}); descAdr := 0
END
ELSE modAdr := 0
END
END AllocModMem;
PROCEDURE DeallocModMem* (descSize, modSize, descAdr, modAdr: INTEGER);
VAR res: INTEGER;
BEGIN
DEC(used, descSize + modSize);
res := WinApi.VirtualFree(descAdr, 0, {15}); (* release *)
res := WinApi.VirtualFree(modAdr, 0, {15}) (* release *)
END DeallocModMem;
PROCEDURE InvalModMem (modSize, modAdr: INTEGER);
VAR res: INTEGER;
BEGIN
DEC(used, modSize);
res := WinApi.VirtualFree(modAdr, modSize, {14}) (* decommit *)
END InvalModMem;
AllocModMem используется в StdLoader.ReadModule; DeallocModMem там же при неуспешной загрузке. В Kernel.UnloadMod используется только InvalModMem.
Дальше нужно выткать в
http://msdn.microsoft.com/en-us/library ... 85%29.aspx