11#include " stdafx.h"
2+ #include < cstdlib>
23
3- HMEMORYMODULE WINAPI LoadLibraryMemory (_In_ PVOID BufferAddress) {
4+ HMEMORYMODULE WINAPI LoadLibraryMemoryExW (
5+ _In_ PVOID BufferAddress,
6+ _In_ size_t Reserved,
7+ _In_opt_ LPCWSTR DllBaseName,
8+ _In_opt_ LPCWSTR DllFullName,
9+ _In_ DWORD Flags) {
410 HMEMORYMODULE hMemoryModule = nullptr ;
5- NTSTATUS status = LdrLoadDllMemory (&hMemoryModule, BufferAddress, 0 );
11+ NTSTATUS status = LdrLoadDllMemoryExW (&hMemoryModule, nullptr , Flags, BufferAddress, Reserved, DllBaseName, DllFullName );
612 if (!NT_SUCCESS (status) || status == STATUS_IMAGE_MACHINE_TYPE_MISMATCH) {
713 SetLastError (RtlNtStatusToDosError (status));
814 }
@@ -15,26 +21,46 @@ HMEMORYMODULE WINAPI LoadLibraryMemoryExA(
1521 _In_opt_ LPCSTR DllBaseName,
1622 _In_opt_ LPCSTR DllFullName,
1723 _In_ DWORD Flags) {
18- HMEMORYMODULE hMemoryModule = nullptr ;
19- NTSTATUS status = LdrLoadDllMemoryExA (&hMemoryModule, nullptr , Flags, BufferAddress, Reserved, DllBaseName, DllFullName);
20- if (!NT_SUCCESS (status) || status == STATUS_IMAGE_MACHINE_TYPE_MISMATCH) {
21- SetLastError (RtlNtStatusToDosError (status));
22- }
23- return hMemoryModule;
24+ LPWSTR _DllName = nullptr , _DllFullName = nullptr ;
25+ size_t size;
26+ HMEMORYMODULE result = nullptr ;
27+ HANDLE heap = NtCurrentPeb ()->ProcessHeap ;
28+
29+ do {
30+ if (DllBaseName) {
31+ size = strlen (DllBaseName) + 1 ;
32+ _DllName = (LPWSTR)RtlAllocateHeap (heap, 0 , sizeof (WCHAR) * size);
33+
34+ if (!_DllName) {
35+ RtlNtStatusToDosError (STATUS_INSUFFICIENT_RESOURCES);
36+ break ;
37+ }
38+
39+ mbstowcs_s (nullptr , _DllName, size, DllBaseName, size);
40+ }
41+
42+ if (DllFullName) {
43+ size = strlen (DllFullName) + 1 ;
44+ _DllFullName = (LPWSTR)RtlAllocateHeap (heap, 0 , sizeof (WCHAR) * size);
45+
46+ if (!_DllFullName) {
47+ RtlNtStatusToDosError (STATUS_INSUFFICIENT_RESOURCES);
48+ break ;
49+ }
50+
51+ mbstowcs_s (nullptr , _DllFullName, size, DllFullName, size);
52+ }
53+
54+ result = LoadLibraryMemoryExW (BufferAddress, 0 , _DllName, _DllFullName, 0 );
55+ } while (false );
56+
57+ RtlFreeHeap (heap, 0 , _DllName);
58+ RtlFreeHeap (heap, 0 , _DllFullName);
59+ return result;
2460}
2561
26- HMEMORYMODULE WINAPI LoadLibraryMemoryExW (
27- _In_ PVOID BufferAddress,
28- _In_ size_t Reserved,
29- _In_opt_ LPCWSTR DllBaseName,
30- _In_opt_ LPCWSTR DllFullName,
31- _In_ DWORD Flags) {
32- HMEMORYMODULE hMemoryModule = nullptr ;
33- NTSTATUS status = LdrLoadDllMemoryExW (&hMemoryModule, nullptr , Flags, BufferAddress, Reserved, DllBaseName, DllFullName);
34- if (!NT_SUCCESS (status) || status == STATUS_IMAGE_MACHINE_TYPE_MISMATCH) {
35- SetLastError (RtlNtStatusToDosError (status));
36- }
37- return hMemoryModule;
62+ HMEMORYMODULE WINAPI LoadLibraryMemory (_In_ PVOID BufferAddress) {
63+ return LoadLibraryMemoryExW (BufferAddress, 0 , nullptr , nullptr , 0 );
3864}
3965
4066BOOL WINAPI FreeLibraryMemory (_In_ HMEMORYMODULE hMemoryModule) {
0 commit comments