Skip to content

Commit 14bdde1

Browse files
committed
Add PhLoadLibraryAsImageResource
1 parent 51b8a7a commit 14bdde1

File tree

2 files changed

+97
-19
lines changed

2 files changed

+97
-19
lines changed

phlib/include/phutil.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1142,6 +1142,21 @@ PhGetNamespaceHandle(
11421142
VOID
11431143
);
11441144

1145+
PHLIBAPI
1146+
NTSTATUS
1147+
NTAPI
1148+
PhLoadLibraryAsImageResource(
1149+
_In_ PWSTR FileName,
1150+
_Out_ PVOID* DllBase
1151+
);
1152+
1153+
PHLIBAPI
1154+
VOID
1155+
NTAPI
1156+
PhFreeLibraryAsImageResource(
1157+
_In_ PVOID DllBase
1158+
);
1159+
11451160
_Success_(return)
11461161
PHLIBAPI
11471162
BOOLEAN

phlib/util.c

Lines changed: 82 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1698,31 +1698,19 @@ PVOID PhGetFileVersionInfo(
16981698
_In_ PWSTR FileName
16991699
)
17001700
{
1701-
PVOID libraryModule;
1702-
PVOID versionInfo;
1703-
1704-
libraryModule = LoadLibraryEx(
1705-
FileName,
1706-
NULL,
1707-
LOAD_LIBRARY_AS_DATAFILE | LOAD_LIBRARY_AS_IMAGE_RESOURCE
1708-
);
1701+
PVOID imageBaseAddress;
1702+
PVOID imageVersionInfo;
17091703

1710-
if (!libraryModule)
1704+
if (!NT_SUCCESS(PhLoadLibraryAsImageResource(FileName, &imageBaseAddress)))
17111705
return NULL;
17121706

1713-
if (PhLoadResource(
1714-
libraryModule,
1715-
MAKEINTRESOURCE(VS_VERSION_INFO),
1716-
VS_FILE_INFO,
1717-
NULL,
1718-
&versionInfo
1719-
))
1707+
if (PhLoadResource(imageBaseAddress, MAKEINTRESOURCE(VS_VERSION_INFO), VS_FILE_INFO, NULL, &imageVersionInfo))
17201708
{
1721-
FreeLibrary(libraryModule);
1722-
return versionInfo;
1709+
PhFreeLibraryAsImageResource(imageBaseAddress);
1710+
return imageVersionInfo;
17231711
}
17241712

1725-
FreeLibrary(libraryModule);
1713+
PhFreeLibraryAsImageResource(imageBaseAddress);
17261714
return NULL;
17271715
}
17281716

@@ -5719,6 +5707,81 @@ NTSTATUS PhAccessResource(
57195707
return STATUS_SUCCESS;
57205708
}
57215709

5710+
NTSTATUS PhLoadLibraryAsImageResource(
5711+
_In_ PWSTR FileName,
5712+
_Out_ PVOID* DllBase
5713+
)
5714+
{
5715+
NTSTATUS status;
5716+
HANDLE fileHandle;
5717+
HANDLE sectionHandle;
5718+
PVOID imageBaseAddress;
5719+
SIZE_T imageBaseLength;
5720+
5721+
status = PhCreateFileWin32(
5722+
&fileHandle,
5723+
FileName,
5724+
FILE_READ_DATA | SYNCHRONIZE,
5725+
FILE_ATTRIBUTE_NORMAL,
5726+
FILE_SHARE_READ | FILE_SHARE_DELETE,
5727+
FILE_OPEN,
5728+
FILE_NON_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT
5729+
);
5730+
5731+
if (!NT_SUCCESS(status))
5732+
return status;
5733+
5734+
status = NtCreateSection(
5735+
&sectionHandle,
5736+
SECTION_QUERY | SECTION_MAP_READ,
5737+
NULL,
5738+
NULL,
5739+
PAGE_READONLY,
5740+
SEC_IMAGE | SEC_NOCACHE,
5741+
fileHandle
5742+
);
5743+
5744+
NtClose(fileHandle);
5745+
5746+
if (!NT_SUCCESS(status))
5747+
return status;
5748+
5749+
imageBaseAddress = NULL;
5750+
imageBaseLength = 0;
5751+
5752+
status = NtMapViewOfSection(
5753+
sectionHandle,
5754+
NtCurrentProcess(),
5755+
&imageBaseAddress,
5756+
0,
5757+
0,
5758+
NULL,
5759+
&imageBaseLength,
5760+
ViewShare,
5761+
0,
5762+
PAGE_READONLY
5763+
);
5764+
5765+
NtClose(sectionHandle);
5766+
5767+
if (NT_SUCCESS(status))
5768+
{
5769+
if (DllBase)
5770+
{
5771+
*DllBase = imageBaseAddress;
5772+
}
5773+
}
5774+
5775+
return status;
5776+
}
5777+
5778+
VOID PhFreeLibraryAsImageResource(
5779+
_In_ PVOID DllBase
5780+
)
5781+
{
5782+
NtUnmapViewOfSection(NtCurrentProcess(), DllBase);
5783+
}
5784+
57225785
_Success_(return)
57235786
BOOLEAN PhLoadResource(
57245787
_In_ PVOID DllBase,

0 commit comments

Comments
 (0)