function WriteProtectedMemory(aBaseAddress, aBuffer: Pointer; aSize: Cardinal):boolean;
var
lOldProtect, lDummy: Cardinal;
begin
if aSize > 0 then begin
lOldProtect := 0;
Result := VirtualProtect(aBaseAddress, aSize, PAGE_EXECUTE_READWRITE, lOldProtect);
if Result then begin
Move(aBuffer^, aBaseAddress^, aSize);
if lOldProtect in [PAGE_EXECUTE, PAGE_EXECUTE_READ, PAGE_EXECUTE_READWRITE, PAGE_EXECUTE_WRITECOPY] then
begin
FlushInstructionCache(GetCurrentProcess, aBaseAddress, aSize);
lDummy := 0;
VirtualProtect(aBaseAddress, aSize, lOldProtect, lDummy);
end
else
Exit(False);
end;
end;
end;