ReactOS  0.4.15-dev-3181-g4acf100
version.cpp File Reference
#include <stdarg.h>
#include <stddef.h>
#include <stdio.h>
#include <string.h>
#include <ntverp.h>
#include <ntddk.h>
#include <ntstrsafe.h>
#include "fx.hpp"
#include <fxldr.h>
#include "fxbugcheck.h"
#include "wdfversionlog.h"
#include "fxifr.h"
#include "fxdynamics.h"
#include "fxlibrarycommon.h"
Include dependency graph for version.cpp:

Go to the source code of this file.

Classes

struct  _DRV_EXTENSION
 

Macros

#define FX_DYNAMICS_GENERATE_TABLE   1
 
#define DRIVER_OBJECT_EXTENSION_IDENTIFIER   DriverEntry
 
#define DRIVER_PARAMETERS   L"Parameters"
 
#define REGISTRY_KMDF_MAJOR_VERSION   L"MajorVersion"
 
#define REGISTRY_KMDF_MINOR_VERSION   L"MinorVersion"
 
#define REGISTRY_KMDF_BUILD_NUMBER   L"BuildNumber"
 
#define KMDF_DEFAULT_NAME
 
#define KMDF_DEVICE_NAME   L"\\Device\\KMDF"
 
#define EVTLOG_MESSAGE_SIZE   70
 
#define RAW_DATA_SIZE   4
 

Typedefs

typedef struct _DRV_EXTENSION DRV_EXTENSION
 
typedef struct _DRV_EXTENSIONPDRV_EXTENSION
 

Functions

 __drv_dispatchType (IRP_MJ_CREATE) __drv_dispatchType(IRP_MJ_CLEANUP) __drv_dispatchType(IRP_MJ_CLOSE) DRIVER_DISPATCH FxLibraryDispatch
 
_Must_inspect_result_ NTSTATUS WDF_LIBRARY_COMMISSION (VOID)
 
_Must_inspect_result_ NTSTATUS WDF_LIBRARY_DECOMMISSION (VOID)
 
_Must_inspect_result_ NTSTATUS WDF_LIBRARY_REGISTER_CLIENT (__inout PWDF_BIND_INFO Info, __deref_out PWDF_DRIVER_GLOBALS *WdfDriverGlobals, __deref_inout PVOID *Context)
 
_Must_inspect_result_ NTSTATUS WDF_LIBRARY_UNREGISTER_CLIENT (__in PWDF_BIND_INFO Info, __in PWDF_DRIVER_GLOBALS WdfDriverGlobals)
 
VOID FxLibraryDeleteDevice (VOID)
 
VOID FxLibraryCleanup (VOID)
 
VOID WdfWriteKmdfVersionToRegistry (__in PDRIVER_OBJECT DriverObject, __in PUNICODE_STRING RegistryPath)
 
VOID WdfDeleteKmdfVersionFromRegistry (__in PDRIVER_OBJECT DriverObject)
 
NTSTATUS FxLibraryDispatch (__in struct _DEVICE_OBJECT *DeviceObject, __in PIRP Irp)
 
_Must_inspect_result_ NTSTATUS FxLibraryCreateDevice (__in PUNICODE_STRING DeviceName)
 
NTSTATUS DriverEntry (__in PDRIVER_OBJECT DriverObject, __in PUNICODE_STRING RegistryPath)
 
VOID DriverUnload (__in PDRIVER_OBJECT DriverObject)
 
_Must_inspect_result_ NTSTATUS WDF_LIBRARY_REGISTER_CLIENT (__in PWDF_BIND_INFO Info, __deref_out PWDF_DRIVER_GLOBALS *WdfDriverGlobals, __deref_inout PVOID *Context)
 

Variables

union {
   WDF_IFR_HEADER *   typeWDF_IFR_HEADER
 
   WDF_IFR_RECORD *   typeWDF_IFR_RECORD
 
   WDF_IFR_OFFSET *   typeWDF_IFR_OFFSET
 
   WDF_BIND_INFO *   typeWDF_BIND_INFO
 
   WDF_OBJECT_CONTEXT_TYPE_INFO *   typeWDF_OBJECT_CONTEXT_TYPE_INFO
 
   WDF_POWER_ROUTINE_TIMED_OUT_DATA *   typeWDF_POWER_ROUTINE_TIMED_OUT_DATA
 
   WDF_BUGCHECK_CODES *   typeWDF_BUGCHECK_CODES
 
   WDF_REQUEST_FATAL_ERROR_CODES *   typeWDF_REQUEST_FATAL_ERROR_CODES
 
   FX_OBJECT_INFO *   typeFX_OBJECT_INFO
 
   FX_POOL_HEADER *   typeFX_POOL_HEADER
 
   FX_POOL *   typeFX_POOL
 
   FxObject *   typeFxObject
 
   FxContextHeader *   typeFxContextHeader
 
   FX_DUMP_DRIVER_INFO_ENTRY *   typeFX_DUMP_DRIVER_INFO_ENTRY
 
   FxTargetSubmitSyncParams *   typeFxTargetSubmitSyncParams
 
uAllPublicTypes
 
DRIVER_UNLOAD DriverUnload
 
DRIVER_INITIALIZE DriverEntry
 
RTL_OSVERSIONINFOW gOsVersion = { sizeof(RTL_OSVERSIONINFOW) }
 
ULONG WdfLdrDbgPrintOn = 0
 
PCHAR WdfLdrType = KMDF_DEFAULT_NAME
 
WDF_LIBRARY_INFO WdfLibraryInfo
 

Macro Definition Documentation

◆ DRIVER_OBJECT_EXTENSION_IDENTIFIER

#define DRIVER_OBJECT_EXTENSION_IDENTIFIER   DriverEntry

Definition at line 36 of file version.cpp.

◆ DRIVER_PARAMETERS

#define DRIVER_PARAMETERS   L"Parameters"

Definition at line 37 of file version.cpp.

◆ EVTLOG_MESSAGE_SIZE

#define EVTLOG_MESSAGE_SIZE   70

Definition at line 438 of file version.cpp.

◆ FX_DYNAMICS_GENERATE_TABLE

#define FX_DYNAMICS_GENERATE_TABLE   1

Definition at line 28 of file version.cpp.

◆ KMDF_DEFAULT_NAME

#define KMDF_DEFAULT_NAME
Value:
"Wdf" ## \
LITERAL(__WDF_MAJOR_VERSION_STRING) ## \
"000"

Definition at line 85 of file version.cpp.

◆ KMDF_DEVICE_NAME

#define KMDF_DEVICE_NAME   L"\\Device\\KMDF"

Definition at line 234 of file version.cpp.

◆ RAW_DATA_SIZE

#define RAW_DATA_SIZE   4

Definition at line 439 of file version.cpp.

◆ REGISTRY_KMDF_BUILD_NUMBER

#define REGISTRY_KMDF_BUILD_NUMBER   L"BuildNumber"

Definition at line 40 of file version.cpp.

◆ REGISTRY_KMDF_MAJOR_VERSION

#define REGISTRY_KMDF_MAJOR_VERSION   L"MajorVersion"

Definition at line 38 of file version.cpp.

◆ REGISTRY_KMDF_MINOR_VERSION

#define REGISTRY_KMDF_MINOR_VERSION   L"MinorVersion"

Definition at line 39 of file version.cpp.

Typedef Documentation

◆ DRV_EXTENSION

◆ PDRV_EXTENSION

Function Documentation

◆ __drv_dispatchType()

__drv_dispatchType ( IRP_MJ_CREATE  )

◆ DriverEntry()

NTSTATUS DriverEntry ( __in PDRIVER_OBJECT  DriverObject,
__in PUNICODE_STRING  RegistryPath 
)

Definition at line 305 of file version.cpp.

309 {
313 
314  //
315  // This creates a local buffer which is big enough to hold a copy of the
316  // constant string assigned to it. It does not point to the constant
317  // string. As such, it is a writeable buffer.
318  //
319  // NOTE: KMDF_DEVICE_NAME L"XXXX" creates a concatenated string of
320  // KMDF_DEVICE_NAME + L"XXXX". This is done to give us room for
321  // appending a number up to 4 digits long after KMDF_DEVICE_NAME if
322  // you want a null terminated string, 5 digits long if the string is
323  // not null terminated (as is the case for a UNICODE_STRING)
324  //
325  WCHAR buffer[] = KMDF_DEVICE_NAME L"XXXX";
326 
327  //
328  // Initialize global to make NonPagedPool be treated as NxPool on Win8
329  // and NonPagedPool on down-level
330  //
331  ExInitializeDriverRuntime(DrvRtPoolNxOptIn);
332 
334 
335  //
336  // Determine if debug prints are on.
337  //
338  (void) WdfLdrDiagnosticsValueByNameAsULONG(&string, &WdfLdrDbgPrintOn);
339 
340  __Print(("DriverEntry\n"));
341 
342  DriverObject->DriverUnload = DriverUnload;
343 
345 
348  DriverObject->MajorFunction[IRP_MJ_CLOSE] = FxLibraryDispatch;
349 
350  RtlZeroMemory(&name, sizeof(name));
351  name.Buffer = buffer;
352  name.Length = 0x0;
353  name.MaximumLength = sizeof(buffer);
354 
355  //
356  // We use the string when we declare the buffer to get the right sized
357  // buffer. Now we want to make sure there are no contents before we
358  // use it to create a device object.
359  //
360  RtlZeroMemory(buffer, sizeof(buffer));
361 
363  if (!NT_SUCCESS(status)) {
364  __Print(("ERROR: FxLibraryCreateDevice failed with Status 0x%x\n", status));
365  return status;
366  }
367 
368  //
369  // Register this library with WdfLdr
370  //
371  // NOTE: Once WdfRegisterLibrary returns NT_SUCCESS() we must return
372  // NT_SUCCESS from DriverEntry!
373  //
375  if (!NT_SUCCESS(status)) {
376  __Print(("ERROR: WdfRegisterLibrary failed with Status 0x%x\n", status));
378  return status;
379  }
380 
381  //
382  // Write KMDF version to registry
383  //
385 
386  return STATUS_SUCCESS;
387 }
WDF_LIBRARY_INFO WdfLibraryInfo
Definition: version.cpp:178
#define IRP_MJ_CREATE
Definition: rdpdr.c:44
struct png_info_def **typedef void(__cdecl typeof(png_destroy_read_struct))(struct png_struct_def **
Definition: typeof.h:49
DRIVER_UNLOAD DriverUnload
Definition: version.cpp:93
LONG NTSTATUS
Definition: precomp.h:26
_Must_inspect_result_ _In_ PDRIVER_OBJECT _In_ PCUNICODE_STRING RegistryPath
Definition: wdfdriver.h:213
ULONG WdfLdrDbgPrintOn
Definition: version.cpp:106
GLuint buffer
Definition: glext.h:5915
NTSTATUS FxLibraryDispatch(__in struct _DEVICE_OBJECT *DeviceObject, __in PIRP Irp)
Definition: version.cpp:191
_Must_inspect_result_ NTSTATUS FxLibraryCreateDevice(__in PUNICODE_STRING DeviceName)
Definition: version.cpp:238
#define WDF_REGISTRY_DBGPRINT_ON
Definition: fxldr.h:115
VOID WdfWriteKmdfVersionToRegistry(__in PDRIVER_OBJECT DriverObject, __in PUNICODE_STRING RegistryPath)
Definition: version.cpp:536
_Must_inspect_result_ _In_ PDRIVER_OBJECT DriverObject
Definition: wdfdriver.h:213
PDRIVER_OBJECT DriverObject
Definition: fxglobals.h:719
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
#define IRP_MJ_CLOSE
Definition: rdpdr.c:45
static const WCHAR L[]
Definition: oid.c:1250
FxLibraryGlobalsType FxLibraryGlobals
Definition: globals.cpp:95
char string[160]
Definition: util.h:11
#define KMDF_DEVICE_NAME
Definition: version.cpp:234
_Must_inspect_result_ NTSTATUS WdfRegisterLibrary(__in PWDF_LIBRARY_INFO LibraryInfo, __in PUNICODE_STRING ServicePath, __in PCUNICODE_STRING LibraryDeviceName)
VOID FxLibraryCleanup(VOID)
Definition: version.cpp:293
#define IRP_MJ_CLEANUP
Definition: name.c:38
PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION+1]
Definition: iotypes.h:2289
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
#define STATUS_SUCCESS
Definition: shellext.h:65
static SERVICE_STATUS status
Definition: service.c:31
#define __Print(_x_)
Definition: ps.c:97
GLuint const GLchar * name
Definition: glext.h:6031

◆ DriverUnload()

VOID DriverUnload ( __in PDRIVER_OBJECT  DriverObject)

Definition at line 394 of file version.cpp.

397 {
398  __Print(("DriverUnload\n"));
399 
400  //
401  // Delete KMDF version from registry before destroying the Driver Object
402  //
404 
405  //
406  // Make sure everything is deleted. Since the driver is considered a legacy
407  // driver, it can be unloaded while there are still outstanding device objects.
408  //
410 }
VOID WdfDeleteKmdfVersionFromRegistry(__in PDRIVER_OBJECT DriverObject)
Definition: version.cpp:680
_Must_inspect_result_ _In_ PDRIVER_OBJECT DriverObject
Definition: wdfdriver.h:213
VOID FxLibraryCleanup(VOID)
Definition: version.cpp:293
#define __Print(_x_)

◆ FxLibraryCleanup()

VOID FxLibraryCleanup ( VOID  )

Definition at line 293 of file version.cpp.

296 {
300  }
301 }
PDEVICE_OBJECT LibraryDeviceObject
Definition: fxglobals.h:728
FxLibraryGlobalsType FxLibraryGlobals
Definition: globals.cpp:95
VOID NTAPI IoDeleteDevice(IN PDEVICE_OBJECT DeviceObject)
Definition: device.c:1251
#define NULL
Definition: types.h:112

Referenced by DriverEntry(), DriverUnload(), and FxLibraryDeleteDevice().

◆ FxLibraryCreateDevice()

_Must_inspect_result_ NTSTATUS FxLibraryCreateDevice ( __in PUNICODE_STRING  DeviceName)

Definition at line 238 of file version.cpp.

241 {
243  ULONG i;
244 
245  i = 0;
246 
247  //
248  // Repeatedly try to create a named device object until we run out of buffer
249  // space or we succeed.
250  //
251  do {
253  if (!NT_SUCCESS(status)) {
254  return status;
255  }
256 
257  //
258  // Create a device with no device extension
259  //
262  0,
263  DeviceName,
265  0,
266  FALSE,
268  );
270 
271  if (NT_SUCCESS(status)) {
272  //
273  // Clear the initializing bit now because the loader will attempt to
274  // open the device before we return from DriverEntry
275  //
278  }
279 
280  return status;
281 }
#define DO_DEVICE_INITIALIZING
Definition: env_spec_w32.h:399
#define STATUS_OBJECT_NAME_COLLISION
Definition: udferr_usr.h:150
PDEVICE_OBJECT LibraryDeviceObject
Definition: fxglobals.h:728
LONG NTSTATUS
Definition: precomp.h:26
_Must_inspect_result_ _In_ PWDFDEVICE_INIT _In_opt_ PCUNICODE_STRING DeviceName
Definition: wdfdevice.h:3272
#define FALSE
Definition: types.h:117
PDRIVER_OBJECT DriverObject
Definition: fxglobals.h:719
#define ASSERT(a)
Definition: mode.c:44
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
NTSTATUS RtlUnicodeStringPrintf(PUNICODE_STRING DestinationString, const WCHAR *pszFormat,...)
static const WCHAR L[]
Definition: oid.c:1250
FxLibraryGlobalsType FxLibraryGlobals
Definition: globals.cpp:95
#define KMDF_DEVICE_NAME
Definition: version.cpp:234
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define NULL
Definition: types.h:112
#define FILE_DEVICE_UNKNOWN
Definition: winioctl.h:140
unsigned int ULONG
Definition: retypes.h:1
NTSTATUS NTAPI IoCreateDevice(IN PDRIVER_OBJECT DriverObject, IN ULONG DeviceExtensionSize, IN PUNICODE_STRING DeviceName, IN DEVICE_TYPE DeviceType, IN ULONG DeviceCharacteristics, IN BOOLEAN Exclusive, OUT PDEVICE_OBJECT *DeviceObject)
Definition: device.c:1031
static SERVICE_STATUS status
Definition: service.c:31
Definition: ps.c:97

Referenced by DriverEntry().

◆ FxLibraryDeleteDevice()

VOID FxLibraryDeleteDevice ( VOID  )

Definition at line 285 of file version.cpp.

288 {
290 }
VOID FxLibraryCleanup(VOID)
Definition: version.cpp:293

◆ FxLibraryDispatch()

NTSTATUS FxLibraryDispatch ( __in struct _DEVICE_OBJECT DeviceObject,
__in PIRP  Irp 
)

Definition at line 191 of file version.cpp.

195 {
197 
200 
202 
204  case IRP_MJ_CREATE:
205  //
206  // To limit our exposure for this device object, only allow kernel mode
207  // creates.
208  //
209  if (Irp->RequestorMode == KernelMode) {
211  }
212  break;
213 
214  case IRP_MJ_CLEANUP:
215  case IRP_MJ_CLOSE:
216  //
217  // Since we allowed a create to succeed, succeed the cleanup and close
218  //
220  break;
221  }
222 
223  Irp->IoStatus.Status = status;
224  Irp->IoStatus.Information = 0x0;
226 
227  return status;
228 }
#define IRP_MJ_CREATE
Definition: rdpdr.c:44
PDEVICE_OBJECT LibraryDeviceObject
Definition: fxglobals.h:728
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:317
LONG NTSTATUS
Definition: precomp.h:26
#define STATUS_INVALID_DEVICE_REQUEST
Definition: udferr_usr.h:138
_In_ PDEVICE_OBJECT DeviceObject
Definition: wdfdevice.h:2055
_In_ PIRP Irp
Definition: csq.h:116
#define IoCompleteRequest
Definition: irp.c:1240
#define ASSERT(a)
Definition: mode.c:44
#define IRP_MJ_CLOSE
Definition: rdpdr.c:45
FxLibraryGlobalsType FxLibraryGlobals
Definition: globals.cpp:95
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(_In_ PIRP Irp)
Definition: iofuncs.h:2793
_In_ UCHAR MajorFunction
Definition: wdfdevice.h:1697
#define IRP_MJ_CLEANUP
#define IO_NO_INCREMENT
Definition: iotypes.h:598
#define STATUS_SUCCESS
Definition: shellext.h:65
static SERVICE_STATUS status
Definition: service.c:31
Definition: ps.c:97

Referenced by DriverEntry().

◆ WDF_LIBRARY_COMMISSION()

NTSTATUS WDF_LIBRARY_COMMISSION ( VOID  )

Definition at line 418 of file version.cpp.

421 {
422  return FxLibraryCommonCommission();
423 }
_Must_inspect_result_ NTSTATUS FxLibraryCommonCommission(VOID)

◆ WDF_LIBRARY_DECOMMISSION()

NTSTATUS WDF_LIBRARY_DECOMMISSION ( VOID  )

Definition at line 431 of file version.cpp.

434 {
436 }
_Must_inspect_result_ NTSTATUS FxLibraryCommonDecommission(VOID)

◆ WDF_LIBRARY_REGISTER_CLIENT() [1/2]

_Must_inspect_result_ NTSTATUS WDF_LIBRARY_REGISTER_CLIENT ( __inout PWDF_BIND_INFO  Info,
__deref_out PWDF_DRIVER_GLOBALS WdfDriverGlobals,
__deref_inout PVOID Context 
)

◆ WDF_LIBRARY_REGISTER_CLIENT() [2/2]

_Must_inspect_result_ NTSTATUS WDF_LIBRARY_REGISTER_CLIENT ( __in PWDF_BIND_INFO  Info,
__deref_out PWDF_DRIVER_GLOBALS WdfDriverGlobals,
__deref_inout PVOID Context 
)

Definition at line 444 of file version.cpp.

449 {
452  WCHAR insertString[EVTLOG_MESSAGE_SIZE];
454  PCLIENT_INFO clientInfo = NULL;
455 
457 
458  clientInfo = (PCLIENT_INFO)*Context;
459  *Context = NULL;
460 
461  ASSERT(Info->Version.Major == WdfLibraryInfo.Version.Major);
462 
463  //
464  // NOTE: If the currently loaded library < drivers minor version fail the load
465  // instead of binding to a lower minor version. The reason for that if there
466  // is a newer API or new contract change made the driver shouldn't be using older
467  // API than it was compiled with.
468  //
469 
470  if (Info->Version.Minor > WdfLibraryInfo.Version.Minor) {
471  status = RtlStringCchPrintfW(insertString,
472  RTL_NUMBER_OF(insertString),
473  L"Driver Version: %d.%d Kmdf Lib. Version: %d.%d",
474  Info->Version.Major,
475  Info->Version.Minor,
478  if (!NT_SUCCESS(status)) {
479  __Print(("ERROR: RtlStringCchPrintfW failed with Status 0x%x\n", status));
480  return status;
481  }
482  rawData[0] = Info->Version.Major;
483  rawData[1] = Info->Version.Minor;
486 
488  WDFVER_MINOR_VERSION_NOT_SUPPORTED,
490  insertString,
491  rawData,
492  sizeof(rawData) );
493  //
494  // this looks like the best status to return
495  //
497 
498  }
499 
502  clientInfo);
503 
504  if (NT_SUCCESS(status)) {
505  //
506  // The context will be a pointer to FX_DRIVER_GLOBALS
507  //
509 
510  //
511  // Set the WDF_BIND_INFO structure pointer in FxDriverGlobals
512  //
515  }
516 
517  return status;
518 }
WDF_LIBRARY_INFO WdfLibraryInfo
Definition: version.cpp:178
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
NTSTRSAFEVAPI RtlStringCchPrintfW(_Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, _In_ size_t cchDest, _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat,...)
Definition: ntstrsafe.h:1110
_Must_inspect_result_ NTSTATUS FxLibraryCommonRegisterClient(__inout PWDF_BIND_INFO Info, __deref_out PWDF_DRIVER_GLOBALS *WdfDriverGlobals, __in_opt PCLIENT_INFO ClientInfo)
WDF_VERSION Version
Definition: fxldr.h:145
LONG NTSTATUS
Definition: precomp.h:26
_Must_inspect_result_ _In_ WDFCHILDLIST _In_ PWDF_CHILD_LIST_ITERATOR _Out_ WDFDEVICE _Inout_opt_ PWDF_CHILD_RETRIEVE_INFO Info
Definition: wdfchildlist.h:683
VOID LibraryLogEvent(__in PDRIVER_OBJECT DriverObject, __in NTSTATUS ErrorCode, __in NTSTATUS FinalStatus, __in PWSTR ErrorInsertionString, __in_bcount(RawDataLen) PVOID RawDataBuf, __in USHORT RawDataLen)
#define RAW_DATA_SIZE
Definition: version.cpp:439
PDRIVER_OBJECT DriverObject
Definition: fxglobals.h:719
#define LITERAL(a)
PWDF_DRIVER_GLOBALS WdfDriverGlobals
#define STATUS_OBJECT_TYPE_MISMATCH
Definition: ntstatus.h:273
PFX_DRIVER_GLOBALS pFxDriverGlobals
#define ASSERT(a)
Definition: mode.c:44
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
PWDF_BIND_INFO WdfBindInfo
Definition: fxglobals.h:405
WDF_MAJOR_VERSION Major
Definition: fxldr.h:122
static const WCHAR L[]
Definition: oid.c:1250
FxLibraryGlobalsType FxLibraryGlobals
Definition: globals.cpp:95
#define RTL_NUMBER_OF(x)
Definition: RtlRegistry.c:12
#define EVTLOG_MESSAGE_SIZE
Definition: version.cpp:438
#define NULL
Definition: types.h:112
struct _CLIENT_INFO * PCLIENT_INFO
unsigned int ULONG
Definition: retypes.h:1
_Must_inspect_result_ NTSTATUS WDF_LIBRARY_REGISTER_CLIENT(__inout PWDF_BIND_INFO Info, __deref_out PWDF_DRIVER_GLOBALS *WdfDriverGlobals, __deref_inout PVOID *Context)
__inline PFX_DRIVER_GLOBALS GetFxDriverGlobals(__in PWDF_DRIVER_GLOBALS DriverGlobals)
Definition: fxglobals.h:597
static unsigned char rawData[2356]
Definition: data.c:573
static SERVICE_STATUS status
Definition: service.c:31
WDF_MINOR_VERSION Minor
Definition: fxldr.h:123
#define __Print(_x_)
Definition: ps.c:97

◆ WDF_LIBRARY_UNREGISTER_CLIENT()

_Must_inspect_result_ NTSTATUS WDF_LIBRARY_UNREGISTER_CLIENT ( __in PWDF_BIND_INFO  Info,
__in PWDF_DRIVER_GLOBALS  WdfDriverGlobals 
)

Definition at line 527 of file version.cpp.

531 {
533 }
_Must_inspect_result_ _In_ WDFCHILDLIST _In_ PWDF_CHILD_LIST_ITERATOR _Out_ WDFDEVICE _Inout_opt_ PWDF_CHILD_RETRIEVE_INFO Info
Definition: wdfchildlist.h:683
_Must_inspect_result_ NTSTATUS FxLibraryCommonUnregisterClient(__in PWDF_BIND_INFO Info, __in PWDF_DRIVER_GLOBALS WdfDriverGlobals)
PWDF_DRIVER_GLOBALS WdfDriverGlobals

◆ WdfDeleteKmdfVersionFromRegistry()

VOID WdfDeleteKmdfVersionFromRegistry ( __in PDRIVER_OBJECT  DriverObject)

Definition at line 680 of file version.cpp.

683 {
685  OBJECT_ATTRIBUTES objectAttributes;
686  HANDLE driverKey;
687  HANDLE parametersKey;
688  UNICODE_STRING valueName;
690  UNICODE_STRING parametersPath;
691  PDRV_EXTENSION driverExtension;
692 
693  RtlInitUnicodeString(&parametersPath, DRIVER_PARAMETERS);
694 
695  driverKey = NULL;
696  parametersKey = NULL;
697 
700 
701  if (driverExtension == NULL || driverExtension->ParametersRegistryPath.Buffer == NULL) {
702  return;
703  }
704 
705  registryPath = &driverExtension->ParametersRegistryPath;
706 
707  InitializeObjectAttributes(&objectAttributes,
708  registryPath,
710  NULL,
711  NULL);
712 
713  status = ZwOpenKey(&driverKey, KEY_SET_VALUE, &objectAttributes);
714  if (!NT_SUCCESS(status)) {
715  goto out;
716  }
717 
718  InitializeObjectAttributes(&objectAttributes,
719  &parametersPath,
721  driverKey,
722  NULL);
723  //
724  // Open the key for deletion
725  //
726  status = ZwOpenKey(&parametersKey,
727  DELETE,
728  &objectAttributes);
729 
730  if (!NT_SUCCESS(status)) {
731  goto out;
732  }
733 
735  ZwDeleteValueKey(parametersKey, &valueName);
736 
738  ZwDeleteValueKey(parametersKey, &valueName);
739 
741  ZwDeleteValueKey(parametersKey, &valueName);
742 
743  ZwDeleteKey(parametersKey);
744 
745 out:
746  if (driverExtension->ParametersRegistryPath.Buffer != NULL) {
747  ExFreePool(driverExtension->ParametersRegistryPath.Buffer);
748  }
749 
750  if (driverKey != NULL) {
751  ZwClose(driverKey);
752  }
753 
754  if (parametersKey != NULL) {
755  ZwClose(parametersKey);
756  }
757 
758  return;
759 }
#define KEY_SET_VALUE
Definition: nt_native.h:1017
#define OBJ_CASE_INSENSITIVE
Definition: winternl.h:228
NTSYSAPI NTSTATUS NTAPI ZwClose(_In_ HANDLE Handle)
#define REGISTRY_KMDF_MAJOR_VERSION
Definition: version.cpp:38
LPCTSTR registryPath
Definition: butterflies.c:16
LONG NTSTATUS
Definition: precomp.h:26
NTSYSAPI NTSTATUS NTAPI ZwDeleteValueKey(__in IN HANDLE Key, __in IN PUNICODE_STRING ValueName)
#define OBJ_KERNEL_HANDLE
Definition: winternl.h:231
_Must_inspect_result_ _In_ PDRIVER_OBJECT DriverObject
Definition: wdfdriver.h:213
#define DRIVER_PARAMETERS
Definition: version.cpp:37
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
static FILE * out
Definition: regtests2xml.c:44
struct _DRV_EXTENSION * PDRV_EXTENSION
#define REGISTRY_KMDF_MINOR_VERSION
Definition: version.cpp:39
PVOID NTAPI IoGetDriverObjectExtension(IN PDRIVER_OBJECT DriverObject, IN PVOID ClientIdentificationAddress)
Definition: driver.c:1877
#define DRIVER_OBJECT_EXTENSION_IDENTIFIER
Definition: version.cpp:36
#define REGISTRY_KMDF_BUILD_NUMBER
Definition: version.cpp:40
#define NULL
Definition: types.h:112
UNICODE_STRING ParametersRegistryPath
Definition: version.cpp:170
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define InitializeObjectAttributes(p, n, a, r, s)
Definition: reg.c:106
static SERVICE_STATUS status
Definition: service.c:31
#define ExFreePool(addr)
Definition: env_spec_w32.h:352
#define DELETE
Definition: nt_native.h:57
Definition: ps.c:97

Referenced by DriverUnload().

◆ WdfWriteKmdfVersionToRegistry()

VOID WdfWriteKmdfVersionToRegistry ( __in PDRIVER_OBJECT  DriverObject,
__in PUNICODE_STRING  RegistryPath 
)

Definition at line 536 of file version.cpp.

540 {
542  OBJECT_ATTRIBUTES objectAttributes;
543  HANDLE driverKey;
544  HANDLE parametersKey;
545  UNICODE_STRING valueName;
546  UNICODE_STRING parametersPath;
547  PDRV_EXTENSION driverExtension;
548 
549  driverKey = NULL;
550  parametersKey = NULL;
551  driverExtension = NULL;
552 
553  RtlInitUnicodeString(&parametersPath, DRIVER_PARAMETERS);
554 
555  InitializeObjectAttributes(&objectAttributes,
556  RegistryPath,
558  NULL,
559  NULL);
560 
561  status = ZwOpenKey(&driverKey, KEY_CREATE_SUB_KEY, &objectAttributes);
562  if (!NT_SUCCESS(status)) {
563  __Print(("WdfWriteKmdfVersionToRegistry: Failed to open HKLM\\%S\n",
564  RegistryPath->Buffer));
565  goto out;
566  }
567 
568  InitializeObjectAttributes(&objectAttributes,
569  &parametersPath,
571  driverKey,
572  NULL);
573 
574  //
575  // Open or create key and get a handle
576  //
577  status = ZwCreateKey(&parametersKey,
579  &objectAttributes,
580  0,
583  NULL);
584 
585  if (!NT_SUCCESS(status)) {
586  __Print(("WdfWriteKmdfVersionToRegistry: Failed to open HKLM\\%S\\%S\n",
587  RegistryPath->Buffer, parametersPath.Buffer));
588  goto out;
589  }
590 
591  //
592  // Set Major Version
593  //
595 
596  status = ZwSetValueKey(parametersKey,
597  &valueName,
598  0,
599  REG_DWORD,
601  sizeof(WdfLibraryInfo.Version.Major));
602 
603  if (!NT_SUCCESS(status)) {
604  __Print(("WdfWriteKmdfVersionToRegistry: Failed to set Major Version\n"));
605  goto out;
606  }
607 
608  //
609  // Set Minor Version
610  //
612 
613  status = ZwSetValueKey(parametersKey,
614  &valueName,
615  0,
616  REG_DWORD,
618  sizeof(WdfLibraryInfo.Version.Minor));
619 
620  if (!NT_SUCCESS(status)) {
621  __Print(("WdfWriteKmdfVersionToRegistry: Failed to set Minor Version\n"));
622  goto out;
623  }
624 
625 
626  //
627  // Set Build Number
628  //
630 
631  status = ZwSetValueKey(parametersKey,
632  &valueName,
633  0,
634  REG_DWORD,
636  sizeof(WdfLibraryInfo.Version.Build));
637 
638  if (!NT_SUCCESS(status)) {
639  __Print(("WdfWriteKmdfVersionToRegistry: Failed to set Build Number\n"));
640  goto out;
641  }
642 
643  //
644  // Create a Driver Extension to store the registry path, where we write the
645  // version of the wdf01000.sys that's loaded in memory
646  //
649  sizeof(DRV_EXTENSION),
650  (PVOID *)&driverExtension);
651 
652  if (!NT_SUCCESS(status) || driverExtension == NULL) {
653  goto out;
654  }
655 
657  PagedPool,
658  RegistryPath->MaximumLength,
659  FX_TAG);
660  if (driverExtension->ParametersRegistryPath.Buffer == NULL) {
661  goto out;
662  }
663 
664  driverExtension->ParametersRegistryPath.MaximumLength = RegistryPath->MaximumLength;
666 
667 out:
668  if (driverKey != NULL) {
669  ZwClose(driverKey);
670  }
671 
672  if (parametersKey != NULL) {
673  ZwClose(parametersKey);
674  }
675 
676  return;
677 }
WDF_LIBRARY_INFO WdfLibraryInfo
Definition: version.cpp:178
NTSTATUS NTAPI IoAllocateDriverObjectExtension(IN PDRIVER_OBJECT DriverObject, IN PVOID ClientIdentificationAddress, IN ULONG DriverObjectExtensionSize, OUT PVOID *DriverObjectExtension)
Definition: driver.c:1799
#define KEY_SET_VALUE
Definition: nt_native.h:1017
#define OBJ_CASE_INSENSITIVE
Definition: winternl.h:228
USHORT MaximumLength
Definition: env_spec_w32.h:370
NTSYSAPI NTSTATUS NTAPI ZwClose(_In_ HANDLE Handle)
#define REGISTRY_KMDF_MAJOR_VERSION
Definition: version.cpp:38
WDF_VERSION Version
Definition: fxldr.h:145
LONG NTSTATUS
Definition: precomp.h:26
_Must_inspect_result_ _In_ PDRIVER_OBJECT _In_ PCUNICODE_STRING RegistryPath
Definition: wdfdriver.h:213
uint16_t * PWCHAR
Definition: typedefs.h:56
#define OBJ_KERNEL_HANDLE
Definition: winternl.h:231
NTSYSAPI VOID NTAPI RtlCopyUnicodeString(PUNICODE_STRING DestinationString, PUNICODE_STRING SourceString)
WDF_BUILD_NUMBER Build
Definition: fxldr.h:124
#define FX_TAG
Definition: fxmacros.hpp:155
_Must_inspect_result_ _In_ PDRIVER_OBJECT DriverObject
Definition: wdfdriver.h:213
#define DRIVER_PARAMETERS
Definition: version.cpp:37
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
static FILE * out
Definition: regtests2xml.c:44
WDF_MAJOR_VERSION Major
Definition: fxldr.h:122
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
#define REGISTRY_KMDF_MINOR_VERSION
Definition: version.cpp:39
#define DRIVER_OBJECT_EXTENSION_IDENTIFIER
Definition: version.cpp:36
#define REGISTRY_KMDF_BUILD_NUMBER
Definition: version.cpp:40
#define NULL
Definition: types.h:112
UNICODE_STRING ParametersRegistryPath
Definition: version.cpp:170
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define InitializeObjectAttributes(p, n, a, r, s)
Definition: reg.c:106
#define REG_OPTION_VOLATILE
Definition: nt_native.h:1060
#define REG_DWORD
Definition: sdbapi.c:596
static SERVICE_STATUS status
Definition: service.c:31
#define KEY_CREATE_SUB_KEY
Definition: nt_native.h:1018
WDF_MINOR_VERSION Minor
Definition: fxldr.h:123
#define __Print(_x_)
Definition: ps.c:97

Referenced by DriverEntry().

Variable Documentation

◆ DriverEntry

DRIVER_INITIALIZE DriverEntry

Definition at line 96 of file version.cpp.

Referenced by TestDriverObject().

◆ DriverUnload

DRIVER_UNLOAD DriverUnload

Definition at line 93 of file version.cpp.

Referenced by DriverEntry().

◆ gOsVersion

Definition at line 104 of file version.cpp.

Referenced by FxLibraryCommonCommission().

◆ typeFX_DUMP_DRIVER_INFO_ENTRY

FX_DUMP_DRIVER_INFO_ENTRY* typeFX_DUMP_DRIVER_INFO_ENTRY

Definition at line 70 of file version.cpp.

◆ typeFX_OBJECT_INFO

FX_OBJECT_INFO* typeFX_OBJECT_INFO

Definition at line 65 of file version.cpp.

◆ typeFX_POOL

FX_POOL* typeFX_POOL

Definition at line 67 of file version.cpp.

◆ typeFX_POOL_HEADER

FX_POOL_HEADER* typeFX_POOL_HEADER

Definition at line 66 of file version.cpp.

◆ typeFxContextHeader

FxContextHeader* typeFxContextHeader

Definition at line 69 of file version.cpp.

◆ typeFxObject

FxObject* typeFxObject

Definition at line 68 of file version.cpp.

◆ typeFxTargetSubmitSyncParams

FxTargetSubmitSyncParams* typeFxTargetSubmitSyncParams

Definition at line 71 of file version.cpp.

◆ typeWDF_BIND_INFO

WDF_BIND_INFO* typeWDF_BIND_INFO

Definition at line 60 of file version.cpp.

◆ typeWDF_BUGCHECK_CODES

WDF_BUGCHECK_CODES* typeWDF_BUGCHECK_CODES

Definition at line 63 of file version.cpp.

◆ typeWDF_IFR_HEADER

WDF_IFR_HEADER* typeWDF_IFR_HEADER

Definition at line 57 of file version.cpp.

◆ typeWDF_IFR_OFFSET

WDF_IFR_OFFSET* typeWDF_IFR_OFFSET

Definition at line 59 of file version.cpp.

◆ typeWDF_IFR_RECORD

WDF_IFR_RECORD* typeWDF_IFR_RECORD

Definition at line 58 of file version.cpp.

◆ typeWDF_OBJECT_CONTEXT_TYPE_INFO

WDF_OBJECT_CONTEXT_TYPE_INFO* typeWDF_OBJECT_CONTEXT_TYPE_INFO

Definition at line 61 of file version.cpp.

◆ typeWDF_POWER_ROUTINE_TIMED_OUT_DATA

WDF_POWER_ROUTINE_TIMED_OUT_DATA* typeWDF_POWER_ROUTINE_TIMED_OUT_DATA

Definition at line 62 of file version.cpp.

◆ typeWDF_REQUEST_FATAL_ERROR_CODES

WDF_REQUEST_FATAL_ERROR_CODES* typeWDF_REQUEST_FATAL_ERROR_CODES

Definition at line 64 of file version.cpp.

◆ uAllPublicTypes

union { ... } uAllPublicTypes

◆ WdfLdrDbgPrintOn

ULONG WdfLdrDbgPrintOn = 0

Definition at line 106 of file version.cpp.

Referenced by DriverEntry().

◆ WdfLdrType

PCHAR WdfLdrType = KMDF_DEFAULT_NAME

Definition at line 108 of file version.cpp.

◆ WdfLibraryInfo

WDF_LIBRARY_INFO WdfLibraryInfo
Initial value:
= {
{ __WDF_MAJOR_VERSION, __WDF_MINOR_VERSION, __WDF_BUILD_NUMBER }
}
_Must_inspect_result_ NTSTATUS WDF_LIBRARY_DECOMMISSION(VOID)
Definition: version.cpp:431
_Must_inspect_result_ NTSTATUS(* PFNLIBRARYREGISTERCLIENT)(__in PWDF_BIND_INFO Info, __deref_out PWDF_COMPONENT_GLOBALS *ComponentGlobals, __deref_inout PVOID *Context)
Definition: fxldr.h:69
_Must_inspect_result_ NTSTATUS WDF_LIBRARY_COMMISSION(VOID)
Definition: version.cpp:418
_Must_inspect_result_ NTSTATUS WDF_LIBRARY_UNREGISTER_CLIENT(__in PWDF_BIND_INFO Info, __in PWDF_DRIVER_GLOBALS WdfDriverGlobals)
Definition: version.cpp:527
_Must_inspect_result_ NTSTATUS(* PFNLIBRARYDECOMMISSION)(VOID)
Definition: fxldr.h:62
struct _WDF_LIBRARY_INFO WDF_LIBRARY_INFO
_Must_inspect_result_ NTSTATUS(* PFNLIBRARYCOMMISSION)(VOID)
Definition: fxldr.h:55
_Must_inspect_result_ NTSTATUS WDF_LIBRARY_REGISTER_CLIENT(__inout PWDF_BIND_INFO Info, __deref_out PWDF_DRIVER_GLOBALS *WdfDriverGlobals, __deref_inout PVOID *Context)
_Must_inspect_result_ NTSTATUS(* PFNLIBRARYUNREGISTERCLIENT)(__in PWDF_BIND_INFO Info, __in PWDF_COMPONENT_GLOBALS DriverGlobals)
Definition: fxldr.h:78

Definition at line 178 of file version.cpp.

Referenced by DriverEntry(), WDF_LIBRARY_REGISTER_CLIENT(), and WdfWriteKmdfVersionToRegistry().