@@ -1698,31 +1698,19 @@ PVOID PhGetFileVersionInfo(
1698
1698
_In_ PWSTR FileName
1699
1699
)
1700
1700
{
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 ;
1709
1703
1710
- if (!libraryModule )
1704
+ if (!NT_SUCCESS ( PhLoadLibraryAsImageResource ( FileName , & imageBaseAddress )) )
1711
1705
return NULL ;
1712
1706
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 ))
1720
1708
{
1721
- FreeLibrary ( libraryModule );
1722
- return versionInfo ;
1709
+ PhFreeLibraryAsImageResource ( imageBaseAddress );
1710
+ return imageVersionInfo ;
1723
1711
}
1724
1712
1725
- FreeLibrary ( libraryModule );
1713
+ PhFreeLibraryAsImageResource ( imageBaseAddress );
1726
1714
return NULL ;
1727
1715
}
1728
1716
@@ -5719,6 +5707,81 @@ NTSTATUS PhAccessResource(
5719
5707
return STATUS_SUCCESS ;
5720
5708
}
5721
5709
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
+
5722
5785
_Success_ (return )
5723
5786
BOOLEAN PhLoadResource (
5724
5787
_In_ PVOID DllBase ,
0 commit comments