3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: lib/kernel32/mem/procmem.c
7 * PROGRAMMER: Boudewijn Dekker
10 /* INCLUDES ******************************************************************/
15 #include "../include/debug.h"
17 /* FUNCTIONS *****************************************************************/
26 LPCVOID lpBaseAddress
,
29 LPDWORD lpNumberOfBytesRead
35 Status
= NtReadVirtualMemory( hProcess
, (PVOID
)lpBaseAddress
,lpBuffer
, nSize
,
36 (PULONG
)lpNumberOfBytesRead
39 if (!NT_SUCCESS(Status
))
41 SetLastErrorByStatus (Status
);
58 SIZE_T
*lpNumberOfBytesWritten
61 NTSTATUS Status
, ProtectStatus
= STATUS_SUCCESS
;
62 MEMORY_BASIC_INFORMATION MemInfo
;
66 if (lpNumberOfBytesWritten
)
68 *lpNumberOfBytesWritten
= 0;
73 Status
= NtQueryVirtualMemory(hProcess
,
75 MemoryBasicInformation
,
77 sizeof(MEMORY_BASIC_INFORMATION
),
80 if (!NT_SUCCESS(Status
))
82 SetLastErrorByStatus(Status
);
85 Length
= MemInfo
.RegionSize
- ((ULONG_PTR
)lpBaseAddress
- (ULONG_PTR
)MemInfo
.BaseAddress
);
90 UnProtect
= MemInfo
.Protect
& (PAGE_READWRITE
|PAGE_WRITECOPY
|PAGE_EXECUTE_READWRITE
|PAGE_EXECUTE_WRITECOPY
) ? FALSE
: TRUE
;
93 MemInfo
.BaseAddress
= lpBaseAddress
;
94 MemInfo
.RegionSize
= Length
;
95 if (MemInfo
.Protect
& (PAGE_EXECUTE
|PAGE_EXECUTE_READ
))
97 MemInfo
.Protect
&= ~(PAGE_EXECUTE
|PAGE_EXECUTE_READ
);
98 MemInfo
.Protect
|= PAGE_EXECUTE_READWRITE
;
102 MemInfo
.Protect
&= ~(PAGE_READONLY
|PAGE_NOACCESS
);
103 MemInfo
.Protect
|= PAGE_READWRITE
;
106 ProtectStatus
= NtProtectVirtualMemory(hProcess
,
107 &MemInfo
.BaseAddress
,
111 if (!NT_SUCCESS(ProtectStatus
))
113 SetLastErrorByStatus(ProtectStatus
);
116 Length
= MemInfo
.RegionSize
- ((ULONG_PTR
)lpBaseAddress
- (ULONG_PTR
)MemInfo
.BaseAddress
);
123 Status
= NtWriteVirtualMemory(hProcess
,
130 ProtectStatus
= NtProtectVirtualMemory(hProcess
,
131 &MemInfo
.BaseAddress
,
136 if (!NT_SUCCESS(Status
))
138 SetLastErrorByStatus (Status
);
141 if (UnProtect
&& !NT_SUCCESS(ProtectStatus
))
143 SetLastErrorByStatus (ProtectStatus
);
146 lpBaseAddress
= (LPVOID
)((ULONG_PTR
)lpBaseAddress
+ Length
);
147 lpBuffer
= (LPCVOID
)((ULONG_PTR
)lpBuffer
+ Length
);
149 if (lpNumberOfBytesWritten
)
151 *lpNumberOfBytesWritten
+= Length
;