ReactOS 0.4.16-dev-981-g80eb313
ntverrsrc.c File Reference
#include "precomp.h"
#include <ndk/ldrtypes.h>
#include <ndk/ldrfuncs.h>
#include "ntverrsrc.h"
#include <debug.h>
Include dependency graph for ntverrsrc.c:

Go to the source code of this file.

Classes

struct  _VS_VERSION_INFO_STRUCT32
 

Macros

#define NDEBUG
 
#define MAKEINTRESOURCE(i)   ((ULONG_PTR)(USHORT)(i))
 
#define RT_VERSION   MAKEINTRESOURCE(16)
 
#define VS_VERSION_INFO   1
 
#define VS_FILE_INFO   RT_VERSION
 
#define DWORD_ALIGN(base, ptr)    ( (ULONG_PTR)(base) + ((((ULONG_PTR)(ptr) - (ULONG_PTR)(base)) + 3) & ~3) )
 
#define VersionInfo32_Value(ver)    DWORD_ALIGN( (ver), (ver)->szKey + wcslen((ver)->szKey) + 1 )
 
#define VersionInfo32_Children(ver)
 
#define VersionInfo32_Next(ver)    (PVS_VERSION_INFO_STRUCT32)( (ULONG_PTR)ver + (((ver)->wLength + 3) & ~3) )
 

Typedefs

typedef struct _VS_VERSION_INFO_STRUCT32 VS_VERSION_INFO_STRUCT32
 
typedef struct _VS_VERSION_INFO_STRUCT32PVS_VERSION_INFO_STRUCT32
 
typedef const VS_VERSION_INFO_STRUCT32PCVS_VERSION_INFO_STRUCT32
 

Functions

NTSTATUS NtGetVersionResource (IN PVOID BaseAddress, OUT PVOID *Resource, OUT PULONG ResourceSize OPTIONAL)
 
static PCVS_VERSION_INFO_STRUCT32 VersionInfo32_FindChild (IN PCVS_VERSION_INFO_STRUCT32 info, IN PCWSTR szKey, IN UINT cchKey)
 
static NTSTATUS VersionInfo32_QueryValue (IN PCVS_VERSION_INFO_STRUCT32 info, IN PCWSTR lpSubBlock, OUT PVOID *lplpBuffer, OUT PUINT puLen OPTIONAL, OUT BOOL *pbText OPTIONAL)
 
NTSTATUS NtVerQueryValue (IN const VOID *pBlock, IN PCWSTR lpSubBlock, OUT PVOID *lplpBuffer, OUT PUINT puLen)
 

Macro Definition Documentation

◆ DWORD_ALIGN

#define DWORD_ALIGN (   base,
  ptr 
)     ( (ULONG_PTR)(base) + ((((ULONG_PTR)(ptr) - (ULONG_PTR)(base)) + 3) & ~3) )

Definition at line 90 of file ntverrsrc.c.

◆ MAKEINTRESOURCE

#define MAKEINTRESOURCE (   i)    ((ULONG_PTR)(USHORT)(i))

Definition at line 25 of file ntverrsrc.c.

◆ NDEBUG

#define NDEBUG

Definition at line 19 of file ntverrsrc.c.

◆ RT_VERSION

#define RT_VERSION   MAKEINTRESOURCE(16)

Definition at line 26 of file ntverrsrc.c.

◆ VersionInfo32_Children

#define VersionInfo32_Children (   ver)
Value:
( ( (ver)->wValueLength * \
((ver)->wType? 2 : 1) + 3 ) & ~3 ) )
const VS_VERSION_INFO_STRUCT32 * PCVS_VERSION_INFO_STRUCT32
Definition: ntverrsrc.c:88
#define VersionInfo32_Value(ver)
Definition: ntverrsrc.c:93

Definition at line 96 of file ntverrsrc.c.

◆ VersionInfo32_Next

#define VersionInfo32_Next (   ver)     (PVS_VERSION_INFO_STRUCT32)( (ULONG_PTR)ver + (((ver)->wLength + 3) & ~3) )

Definition at line 101 of file ntverrsrc.c.

◆ VersionInfo32_Value

#define VersionInfo32_Value (   ver)     DWORD_ALIGN( (ver), (ver)->szKey + wcslen((ver)->szKey) + 1 )

Definition at line 93 of file ntverrsrc.c.

◆ VS_FILE_INFO

#define VS_FILE_INFO   RT_VERSION

Definition at line 28 of file ntverrsrc.c.

◆ VS_VERSION_INFO

#define VS_VERSION_INFO   1

Definition at line 27 of file ntverrsrc.c.

Typedef Documentation

◆ PCVS_VERSION_INFO_STRUCT32

◆ PVS_VERSION_INFO_STRUCT32

◆ VS_VERSION_INFO_STRUCT32

Function Documentation

◆ NtGetVersionResource()

NTSTATUS NtGetVersionResource ( IN PVOID  BaseAddress,
OUT PVOID Resource,
OUT PULONG ResourceSize  OPTIONAL 
)

Definition at line 31 of file ntverrsrc.c.

35{
37 LDR_RESOURCE_INFO ResourceInfo;
38 PIMAGE_RESOURCE_DATA_ENTRY ResourceDataEntry;
39 PVOID Data = NULL;
40 ULONG Size = 0;
41
42 /* Try to find the resource (language-neutral) */
43 ResourceInfo.Type = RT_VERSION;
44 ResourceInfo.Name = VS_VERSION_INFO;
46
48 &ResourceInfo,
50 &ResourceDataEntry);
51 if (!NT_SUCCESS(Status))
52 {
53 DPRINT1("NtGetVersionResource: Version resource not found, Status 0x%08lx\n", Status);
54 return Status;
55 }
56
57 /* Access the resource */
59 ResourceDataEntry,
60 &Data,
61 &Size);
62 if (!NT_SUCCESS(Status))
63 {
64 DPRINT1("NtGetVersionResource: Cannot access Version resource, Status 0x%08lx\n", Status);
65 return Status;
66 }
67
68 *Resource = Data;
69 if (ResourceSize) *ResourceSize = Size;
70
71 return STATUS_SUCCESS;
72}
LONG NTSTATUS
Definition: precomp.h:26
#define DPRINT1
Definition: precomp.h:8
_Acquires_exclusive_lock_ Resource _Acquires_shared_lock_ Resource _Inout_ PERESOURCE Resource
Definition: cdprocs.h:843
#define NULL
Definition: types.h:112
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
Status
Definition: gdiplustypes.h:25
NTSTATUS NTAPI LdrAccessResource(_In_ PVOID BaseAddress, _In_ PIMAGE_RESOURCE_DATA_ENTRY ResourceDataEntry, _Out_opt_ PVOID *Resource, _Out_opt_ PULONG Size)
NTSTATUS NTAPI LdrFindResource_U(_In_ PVOID BaseAddress, _In_ PLDR_RESOURCE_INFO ResourceInfo, _In_ ULONG Level, _Out_ PIMAGE_RESOURCE_DATA_ENTRY *ResourceDataEntry)
#define RESOURCE_DATA_LEVEL
Definition: ldrtypes.h:33
_In_ HANDLE _Outptr_result_bytebuffer_ ViewSize PVOID * BaseAddress
Definition: mmfuncs.h:404
#define VS_VERSION_INFO
Definition: ntverrsrc.c:27
#define RT_VERSION
Definition: ntverrsrc.c:26
#define LANG_NEUTRAL
Definition: nls.h:22
#define MAKELANGID(p, s)
Definition: nls.h:15
#define SUBLANG_NEUTRAL
Definition: nls.h:167
#define STATUS_SUCCESS
Definition: shellext.h:65
Definition: pedump.c:458
ULONG_PTR Language
Definition: ldrtypes.h:187
ULONG_PTR Name
Definition: ldrtypes.h:186
ULONG_PTR Type
Definition: ldrtypes.h:185
uint32_t ULONG
Definition: typedefs.h:59
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
Definition: wdfdevice.h:4533

Referenced by CheckForValidPEAndVendor().

◆ NtVerQueryValue()

NTSTATUS NtVerQueryValue ( IN const VOID pBlock,
IN PCWSTR  lpSubBlock,
OUT PVOID lplpBuffer,
OUT PUINT  puLen 
)

Definition at line 175 of file ntverrsrc.c.

180{
182
183 DPRINT("%s (%p, %S, %p, %p)\n", __FUNCTION__, pBlock, lpSubBlock, lplpBuffer, puLen);
184
185 if (!pBlock)
186 return FALSE;
187
188 if (!lpSubBlock || !*lpSubBlock)
189 lpSubBlock = L"\\";
190
191 return VersionInfo32_QueryValue(info, lpSubBlock, lplpBuffer, puLen, NULL);
192}
#define FALSE
Definition: types.h:117
#define __FUNCTION__
Definition: types.h:116
#define L(x)
Definition: ntvdm.h:50
static NTSTATUS VersionInfo32_QueryValue(IN PCVS_VERSION_INFO_STRUCT32 info, IN PCWSTR lpSubBlock, OUT PVOID *lplpBuffer, OUT PUINT puLen OPTIONAL, OUT BOOL *pbText OPTIONAL)
Definition: ntverrsrc.c:125
#define DPRINT
Definition: sndvol32.h:73

Referenced by CheckForValidPEAndVendor().

◆ VersionInfo32_FindChild()

static PCVS_VERSION_INFO_STRUCT32 VersionInfo32_FindChild ( IN PCVS_VERSION_INFO_STRUCT32  info,
IN PCWSTR  szKey,
IN UINT  cchKey 
)
static

Definition at line 105 of file ntverrsrc.c.

109{
111
112 while ((ULONG_PTR)child < (ULONG_PTR)info + info->wLength)
113 {
114 if (!_wcsnicmp(child->szKey, szKey, cchKey) && !child->szKey[cchKey])
115 return child;
116
117 if (child->wLength == 0) return NULL;
119 }
120
121 return NULL;
122}
static HWND child
Definition: cursoricon.c:298
#define VersionInfo32_Next(ver)
Definition: ntverrsrc.c:101
#define VersionInfo32_Children(ver)
Definition: ntverrsrc.c:96
_Check_return_ _CRTIMP int __cdecl _wcsnicmp(_In_reads_or_z_(_MaxCount) const wchar_t *_Str1, _In_reads_or_z_(_MaxCount) const wchar_t *_Str2, _In_ size_t _MaxCount)
uint32_t ULONG_PTR
Definition: typedefs.h:65

Referenced by VersionInfo32_QueryValue().

◆ VersionInfo32_QueryValue()

static NTSTATUS VersionInfo32_QueryValue ( IN PCVS_VERSION_INFO_STRUCT32  info,
IN PCWSTR  lpSubBlock,
OUT PVOID lplpBuffer,
OUT PUINT puLen  OPTIONAL,
OUT BOOL *pbText  OPTIONAL 
)
static

Definition at line 125 of file ntverrsrc.c.

131{
132 PCWSTR lpNextSlash;
133
134 DPRINT("lpSubBlock : (%S)\n", lpSubBlock);
135
136 while (*lpSubBlock)
137 {
138 /* Find next path component */
139 for (lpNextSlash = lpSubBlock; *lpNextSlash; lpNextSlash++)
140 {
141 if (*lpNextSlash == '\\')
142 break;
143 }
144
145 /* Skip empty components */
146 if (lpNextSlash == lpSubBlock)
147 {
148 lpSubBlock++;
149 continue;
150 }
151
152 /* We have a non-empty component: search info for key */
153 info = VersionInfo32_FindChild(info, lpSubBlock, lpNextSlash - lpSubBlock);
154 if (!info)
155 {
156 if (puLen) *puLen = 0;
158 }
159
160 /* Skip path component */
161 lpSubBlock = lpNextSlash;
162 }
163
164 /* Return value */
165 *lplpBuffer = (PVOID)VersionInfo32_Value(info);
166 if (puLen)
167 *puLen = info->wValueLength;
168 if (pbText)
169 *pbText = info->wType;
170
171 return STATUS_SUCCESS;
172}
#define STATUS_RESOURCE_TYPE_NOT_FOUND
Definition: ntstatus.h:374
static PCVS_VERSION_INFO_STRUCT32 VersionInfo32_FindChild(IN PCVS_VERSION_INFO_STRUCT32 info, IN PCWSTR szKey, IN UINT cchKey)
Definition: ntverrsrc.c:105
const uint16_t * PCWSTR
Definition: typedefs.h:57
void * PVOID
Definition: typedefs.h:50

Referenced by NtVerQueryValue().