13 #if DBG || defined(_DEBUG)
18 #error "DBG conflicts with _DEBUG"
35 #define _countof(a) (sizeof(a)/sizeof((a)[0]))
37 #define HANDLE_NULL NULL
46 ULONG HandleAttributes,
47 PACCESS_STATE PassedAccessState,
48 ACCESS_MASK DesiredAccess,
49 POBJECT_TYPE ObjectType,
50 KPROCESSOR_MODE AccessMode,
55 IN HANDLE ProcessHandle,
56 IN PROCESSINFOCLASS ProcessInformationClass,
57 OUT PVOID ProcessInformation,
58 IN ULONG ProcessInformationLength,
59 OUT PULONG uReturnLength OPTIONAL);
78 #ifndef DEBUG_VARIABLE
79 #define DEBUG_VARIABLE DBG_DebugLevel
80 extern DL_TYPE DBG_DebugLevel;
86 #define DBG_PREFIX "KCOM: "
88 #ifndef DBG_COMPONENTID
89 #define DBG_COMPONENTID DPFLTR_IHVDRIVER_ID
93 #define DBG_MSG_F(_Level) ::GrayKernel::DBG_##_Level##_F
94 #define DBG_MSG_F_DECL(_Level) \
95 inline void _cdecl DBG_MSG_F(_Level)( const char* pszFormat, ... ) \
98 va_start( vargs, pszFormat ); \
99 vDbgPrintExWithPrefix( DBG_PREFIX, DBG_COMPONENTID, DL_##_Level, (PCH) pszFormat, vargs ); \
102 DBG_MSG_F_DECL(ERROR)
104 DBG_MSG_F_DECL(TRACE)
107 #define DBG_MSG_F(_Level) DbgPrint( DBG_PREFIX ); DbgPrint
111 #define DBG_ERROR(_stmt) { if (DEBUG_VARIABLE>=DL_ERROR) { DBG_MSG_F(ERROR) _stmt; }}
112 #define DBG_WARN(_stmt) { if (DEBUG_VARIABLE>=DL_WARN) { DBG_MSG_F(WARN) _stmt; }}
113 #define DBG_TRACE(_stmt) { if (DEBUG_VARIABLE>=DL_TRACE) { DBG_MSG_F(TRACE) _stmt; }}
114 #define DBG_BLAB(_stmt) { if (DEBUG_VARIABLE>=DL_BLAB) { DBG_MSG_F(BLAB) _stmt; }}
117 #define ASSERT3(exp, p1, p2, p3) { if (!(exp)) { ::KeBugCheckEx(0xDEAD1FE0, (DBG_FILE_ID << 16) + __LINE__, p1, p2, p3); }}
120 #define ASSERT(exp) { if (!(exp)) { DBG_ERROR(( "ASSERT:'%s'" DBG_CR, #exp )); DbgBreakPoint(); }}
125 #define DBG_ERROR(stmt)
126 #define DBG_WARN(stmt)
127 #define DBG_TRACE(stmt)
128 #define DBG_BLAB(stmt)
130 #define ASSERT3(exp, p1, p2, p3)
136 #define CKeMem_Free(p,_UTAG) ::ExFreePoolWithTag(p,_UTAG);
138 #define CKeMem_Free(p,_UTAG) ::ExFreePool(p);
141 template <
class TYPE, ULONG _UTAG = 'IKUn' >
153 bool AllocMem(POOL_TYPE ePoolType, SIZE_T nNumberOfBytes =
sizeof(
TYPE))
156 m_p = (
TYPE*) ::ExAllocatePoolWithTag(ePoolType, nNumberOfBytes, _UTAG);
162 NTSTATUS lStatus = STATUS_SUCCESS;
167 m_p = (
TYPE*)ExAllocatePoolWithQuotaTag(ePoolType, nNumberOfBytes, _UTAG);
169 __except (EXCEPTION_EXECUTE_HANDLER)
171 lStatus = GetExceptionCode();
197 return m_p !=
nullptr;
213 template< ULONG _UTAG >
227 struct __declspec(novtable) CKeMDL :
public _MDL
238 void ProbeAndLockPages(IN KPROCESSOR_MODE eAccessMode = KernelMode, IN LOCK_OPERATION eOperation = IoModifyAccess)
242 ASSERT(KeGetCurrentIrql() <= DISPATCH_LEVEL);
243 MmProbeAndLockPages(
this, eAccessMode, eOperation);
245 void MapLockedPages(KPROCESSOR_MODE eAccessMode = KernelMode)
249 MmMapLockedPages(
this, eAccessMode);
293 operator LONG()
const
300 struct CKeInterlocked64
309 CKeInterlocked64(LONGLONG qVal) : m_qVal(qVal)
311 void Init(LONGLONG qVal = 0)
317 return InterlockedIncrement64(&m_qVal);
321 return InterlockedDecrement64(&m_qVal);
323 LONGLONG
Exchange(LONGLONG qVal = 0)
325 return InterlockedExchange64(&m_qVal, qVal);
329 return InterlockedExchangeAdd64(&m_qVal, qValAdd);
331 LONGLONG ExchangeIf(LONGLONG qValCompare, LONGLONG qVal = 0)
335 return InterlockedCompareExchange64(&m_qVal, qVal, qValCompare);
337 operator LONGLONG()
const
344 template <
class TYPE>
359 return (
TYPE*)InterlockedExchangePointer(&
m_pVal, pVal);
364 return (
TYPE*)InterlockedCompareExchangePointer(&
m_pVal, pVal, pValCompare);
376 template <
class TYPE>
399 operator KSPIN_LOCK&()
403 operator PKSPIN_LOCK()
421 ASSERT(pSpinLock !=
nullptr);
423 m_OldIrql = KeAcquireSpinLockRaiseToDpc(pSpinLock);
425 m_OldIrql = ::KfAcquireSpinLock(pSpinLock);
446 ASSERT(pSpinLock !=
nullptr);
447 ::KeAcquireSpinLockAtDpcLevel(pSpinLock);
468 RtlZeroMemory(&m_Val,
sizeof(m_Val));
471 void Add(ULONG uDelta = 1)
474 RtlLargeIntegerAdd(m_Val, (RtlConvertUlongToLargeInteger(uDelta)));
479 RtlLargeIntegerSubtract(m_Val, (RtlConvertUlongToLargeInteger(uDelta)));
484 ASSERT(RtlLargeIntegerGreaterOrEqualToZero(m_Val));
485 return RtlLargeIntegerEqualToZero(m_Val) ? true :
false;
489 return m_Val.LowPart;
514 LARGE_INTEGER uTimeNow;
515 ::KeQuerySystemTime(&uTimeNow);
516 LONGLONG nDiff = uTimeNow.QuadPart -
m_TimeVal.QuadPart;
517 int iDiffSec = (int)(nDiff / (1000 * 1000 * 10));
523 LARGE_INTEGER localTime;
524 ::ExSystemTimeToLocalTime(&
m_TimeVal, &localTime);
527 #define LOCAL_TIME_SHIFT (5*60*60)
528 m_TimeVal.QuadPart += (LONGLONG)(10000) * 1000 * LOCAL_TIME_SHIFT;
533 ASSERT(pTimeFields !=
nullptr);
534 ::RtlTimeToTimeFields(&
m_TimeVal, pTimeFields);
542 template <
class TYPE>
543 struct __declspec(novtable) CKeObject :
public TYPE
565 void ReferenceObject()
569 ASSERT(::KeGetCurrentIrql() == PASSIVE_LEVEL);
570 ::ObReferenceObject(
this);
575 ASSERT(::KeGetCurrentIrql() == PASSIVE_LEVEL);
576 ::ObDereferenceObject(
this);
583 const TYPE* get_CPtr()
const
587 CSHORT get_ObjectType()
const
594 CSHORT get_ObjectSize()
const
602 template <
class TYPE>
611 : m_pObject((CKeObject<
TYPE>*) pObject)
616 IN ACCESS_MASK uDesiredAccess = FILE_ANY_ACCESS,
617 IN POBJECT_TYPE pObjectType =
nullptr,
618 IN KPROCESSOR_MODE eAccessMode = KernelMode,
619 OUT POBJECT_HANDLE_INFORMATION pHandleInformation =
nullptr)
622 ASSERT(m_pObject ==
nullptr);
623 ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL);
624 return ObReferenceObjectByHandle(Handle,
635 ASSERT(m_pObject !=
nullptr);
636 m_pObject->ReferenceObject();
640 if (m_pObject ==
nullptr)
642 m_pObject->ReleaseObject();
647 CKeObject<TYPE>* pObject = m_pObject;
653 if (m_pObject ==
nullptr)
655 m_pObject->ReleaseObject();
659 return (
TYPE**)&m_pObject;
667 return m_pObject !=
nullptr;
682 CKeObject<TYPE>* m_pObject;
686 template <
class TYPE>
687 struct CKeObjectPtrX :
public CKeObjectPtr<TYPE>
692 CKeObjectPtrX(
TYPE* pObject =
nullptr)
693 : CKeObjectPtr(pObject)
729 return STATUS_SUCCESS;
732 return ZwClose(HandleTmp);
735 ULONG uHandleAttributes = OBJ_KERNEL_HANDLE,
736 PACCESS_STATE pPassedAccessState =
nullptr,
737 ACCESS_MASK uDesiredAccess = FILE_ANY_ACCESS,
738 POBJECT_TYPE pObjectType =
nullptr,
739 KPROCESSOR_MODE eAccessMode = KernelMode
751 operator HANDLE()
const
766 void InitTimer(IN PKDEFERRED_ROUTINE DeferredRoutine, IN PVOID DeferredContext)
769 ::KeInitializeDpc(&
m_Dpc, DeferredRoutine, DeferredContext);
792 ::KeRemoveQueueDpc(&
m_Dpc);
807 ::KeInitializeEvent(
this, NotificationEvent,
false);
811 ASSERT(::KeGetCurrentIrql() <= DISPATCH_LEVEL);
812 ::KeClearEvent(
this);
816 ASSERT(::KeGetCurrentIrql() <= DISPATCH_LEVEL);
817 return ::KeSetEvent(
this, IO_NO_INCREMENT,
false);
822 ASSERT(::KeGetCurrentIrql() == PASSIVE_LEVEL);
823 return ::KeWaitForSingleObject(
841 if (Buffer !=
nullptr)
842 RtlUpcaseUnicodeString(
nullptr,
this,
false);
856 MaximumLength = wLength + 1;
857 Buffer = (PWSTR)pStr;
863 ASSERT(KeGetCurrentIrql() <= DISPATCH_LEVEL);
865 RtlInitUnicodeString(
this, (PWSTR)pStr);
866 ASSERT(Length < MaximumLength);
872 MaximumLength = uMaximumLength;
878 RtlZeroMemory(pBuffer, uMaximumLength);
883 return(Buffer !=
nullptr);
885 operator PCWSTR()
const
896 PWSTR pBuffer = Buffer;
897 ASSERT(pBuffer !=
nullptr);
904 return RtlCompareUnicodeString((UNICODE_STRING*)
this, (UNICODE_STRING*)&rString2, bCaseInSensitive);
909 return RtlIntegerToUnicodeString(uValue, uBase,
this);
911 NTSTATUS
ToInteger(ULONG& uValue, ULONG nBase = 10)
const
914 return RtlUnicodeStringToInteger((UNICODE_STRING*)(
this), nBase, &uValue);
916 NTSTATUS
FromInt64(IN ULONGLONG Value, IN ULONG nBase = 10)
918 return RtlInt64ToUnicodeString(Value, nBase,
this);
920 NTSTATUS
FromAnsi(PANSI_STRING pStr,
bool bAlloc =
false)
923 return RtlAnsiStringToUnicodeString(
this, pStr, bAlloc);
928 return RtlAppendUnicodeStringToString((UNICODE_STRING*)
this, (UNICODE_STRING*)&str);
933 return RtlAppendUnicodeToString(
this, pwSource);
938 if (!NT_SUCCESS(lStatus))
940 lStatus = RtlAppendUnicodeToString(
this, pwSource);
947 numStr.
InitBuffer(numStrBuf,
sizeof(numStrBuf));
948 NTSTATUS lStatus = numStr.
FromInteger(uValue, uBase);
949 if (!NT_SUCCESS(lStatus))
955 if (Buffer !=
nullptr)
957 RtlFreeUnicodeString(
this);
986 if (Buffer !=
nullptr)
996 ASSERT(!(nLengthStr & 1));
998 return STATUS_SUCCESS;
999 size_t nLengthNew = Length + nLengthStr;
1000 if (nLengthNew >= MaximumLength)
1003 PWSTR pBufferOld = Buffer;
1004 Buffer = (PWSTR)ExAllocatePoolWithTag(PagedPool, nLengthNew +
sizeof(WCHAR),
CKeStringU_TAG);
1005 if (Buffer ==
nullptr)
1007 Buffer = pBufferOld;
1008 return STATUS_INSUFFICIENT_RESOURCES;
1010 MaximumLength = (USHORT)nLengthNew +
sizeof(WCHAR);
1011 if (pBufferOld !=
nullptr)
1013 RtlCopyMemory(Buffer, pBufferOld, Length);
1017 ASSERT(Buffer !=
nullptr);
1018 RtlCopyMemory(((PUCHAR)Buffer) + Length, pStr, nLengthStr);
1019 Buffer[nLengthNew /
sizeof(WCHAR)] =
'\0';
1020 Length = (USHORT)nLengthNew;
1021 ASSERT(Length < MaximumLength);
1022 return STATUS_SUCCESS;
1027 return AppendStr(pStr, (USHORT)(wcslen(pStr) *
sizeof(WCHAR)));
1031 return AppendStr(str.Buffer, str.Length);
1036 if (!NT_SUCCESS(lStatus))
1040 void AppendStr(NTSTATUS& lStatus, PCWSTR pStr, USHORT nLengthStr)
1042 if (!NT_SUCCESS(lStatus))
1046 void AppendStr(NTSTATUS& lStatus,
const UNICODE_STRING& str)
1048 if (!NT_SUCCESS(lStatus))
1055 WCHAR numStrBuf[20];
1057 numStr.
InitBuffer(numStrBuf,
sizeof(numStrBuf));
1058 NTSTATUS lStatus = numStr.
FromInteger(uValue, uBase);
1059 if (!NT_SUCCESS(lStatus))
1066 if (!NT_SUCCESS(lStatus))
1076 ASSERT(KeGetCurrentIrql() <= PASSIVE_LEVEL);
1077 ASSERT(!(nLengthStr & 1));
1079 Buffer = (PWSTR)ExAllocatePoolWithTag(PagedPool, nLengthStr +
sizeof(WCHAR),
CKeStringU_TAG);
1080 if (Buffer ==
nullptr)
1084 return STATUS_INSUFFICIENT_RESOURCES;
1086 MaximumLength = (USHORT)nLengthStr;
1087 ASSERT(Buffer !=
nullptr);
1088 RtlCopyMemory(Buffer, pStr, nLengthStr);
1089 Buffer[nLengthStr /
sizeof(WCHAR)] =
'\0';
1090 Length = (USHORT)nLengthStr;
1091 return STATUS_SUCCESS;
1095 return CreateStr(str.Buffer, str.Length);
1101 return CreateStr(pStr, (USHORT)(wcslen(pStr) *
sizeof(WCHAR)));
1106 if (Buffer !=
nullptr)
1129 RtlInitAnsiString(
this, (PCHAR)pStr);
1135 MaximumLength = uMaximumLength;
1140 return(Buffer !=
nullptr);
1149 return RtlCharToInteger(Buffer, nBase, &uValue);
1153 void FromInteger(ULONG uValue, ULONG nBase = 10,
int iWidth = 32)
1156 if (iWidth >=
sizeof(buffer) - 1)
1157 iWidth =
sizeof(buffer) - 1;
1158 PCHAR pBufEnd = buffer +
sizeof(buffer) - 1;
1160 PCHAR pBuf = pBufEnd;
1163 ULONG d = uValue % nBase;
1164 *(--pBuf) = (CHAR)(d + ((d < 10) ?
'0' : (
'A' - 10)));
1168 for (; iWidth > 0; iWidth--)
1179 return RtlUnicodeStringToAnsiString(
this, pStr, bAlloc);
1186 ASSERT(Length < MaximumLength);
1188 if (Length + uLenStr >= MaximumLength)
1191 lStatus = STATUS_BUFFER_TOO_SMALL;
1192 uLenStr = (MaximumLength - Length) - 1;
1196 lStatus = STATUS_SUCCESS;
1198 RtlCopyMemory(Buffer + Length, pStr, uLenStr);
1200 Buffer[Length] =
'\0';
1201 ASSERT(Length < MaximumLength);
1207 return AppendStr(str.Buffer, str.Length);
1222 ASSERT(Length < MaximumLength);
1224 if (Length + uLenStr >= MaximumLength)
1227 lStatus = STATUS_BUFFER_TOO_SMALL;
1228 uLenStr = (MaximumLength - Length) - 1;
1232 lStatus = STATUS_SUCCESS;
1234 USHORT uLenChars = uLenStr /
sizeof(WCHAR);
1235 for (; uLenChars--; Length++, pStr++)
1238 Buffer[Length] = (ch & 0xFF00) ?
'?' : (CHAR)(ch);
1240 Buffer[Length] =
'\0';
1241 ASSERT(Length < MaximumLength);
1247 return AppendStr(pStr, (USHORT)(wcslen(pStr) *
sizeof(WCHAR)));
1251 if (Buffer !=
nullptr)
1253 RtlFreeAnsiString(
this);
1271 ::InitializeListHead(
this);
1276 return ::IsListEmpty(
this) ? true :
false;
1280 ASSERT(Flink !=
nullptr);
1285 ASSERT(Flink !=
nullptr);
1286 PLIST_ENTRY pEntry = Flink;
1288 for (; pEntry !=
this; iCount++)
1290 pEntry = pEntry->Flink;
1299 PLIST_ENTRY pTmp = RemoveHeadList(
this);
1306 ASSERT(Blink !=
nullptr);
1307 InsertHeadList(
this, pObj);
1313 ASSERT(Flink !=
nullptr);
1314 InsertTailList(
this, pObj);
1319 ASSERT(Flink !=
nullptr);
1320 ASSERT(pSpinLock !=
nullptr);
1321 ExInterlockedInsertTailList(
this, pObj, pSpinLock);
1329 if (Flink ==
nullptr)
1337 ASSERT(Blink !=
nullptr);
1342 ASSERT(Flink !=
nullptr);
1349 RemoveEntryList(
this);
1355 template<
class TYPE,
int _OFFSET_ENTRY = 0 >
1366 return((
TYPE*)(((PUCHAR)pObj) - _OFFSET_ENTRY));
1372 return((PLIST_ENTRY)(((PUCHAR)pObj) + _OFFSET_ENTRY));
1376 ASSERT(Flink !=
nullptr);
1384 PLIST_ENTRY pTmp = RemoveHeadList(
this);
1389 return(
GetCast(pObj) ==
this);
1395 PLIST_ENTRY pEntry = Flink;
1396 ASSERT(pEntry !=
nullptr);
1399 PLIST_ENTRY pEntryNext = pEntry->Flink;
1400 RemoveEntryList(pEntry);
1401 GetCast(pEntry)->DestroyThis();
1402 pEntry = pEntryNext;
1407 __super::AddHead(
GetCast(pObj));
1411 __super::AddTail(
GetCast(pObj));
1415 __super::AddTailLocked(
GetCast(pObj), pSpinLock);
1419 return GetCast(pObj->m_ListEntry.get_Next());
1425 template< ULONG _UTAG >
1445 template<
class TYPE,
int _OFFSET_ENTRY = offsetof(TYPE, m_ListEntry) >
1455 return((
TYPE*)(((PUCHAR)pObj) - _OFFSET_ENTRY));
1461 return((PLIST_ENTRY)(((PUCHAR)pObj) + _OFFSET_ENTRY));
1491 ASSERT(!pObj->IsListLinked());
1535 return GetCast(pObj->m_ListEntry.get_Next());
1555 return(IoStatus.Status);
1560 return IoStatus.Information;
1565 return(AssociatedIrp.SystemBuffer);
1570 ASSERT(KeGetCurrentIrql() <= DISPATCH_LEVEL);
1576 RemoveEntryList(&Tail.Overlay.ListEntry);
1581 return IoSetCancelRoutine(
this, pCancelRoutine);
1586 return IoCancelIrp(
this);
1591 ASSERT(KeGetCurrentIrql() <= DISPATCH_LEVEL);
1593 IoMarkIrpPending(
this);
1600 IoCompleteRequest(
this, cPriorityBoost);
1602 void CompleteRequestStatus(NTSTATUS lStatus = STATUS_SUCCESS, ULONG_PTR uInformation = 0, CCHAR cPriorityBoost = IO_NO_INCREMENT)
1604 IoStatus.Status = lStatus;
1605 IoStatus.Information = uInformation;
1612 ASSERT(pDeviceObject !=
nullptr);
1613 ASSERT(KeGetCurrentIrql() <= DISPATCH_LEVEL);
1614 return IoCallDriver(pDeviceObject,
this);
1621 return ::IoGetCurrentIrpStackLocation(
const_cast<_IRP*
>(get_CPtr()));
1626 IoSkipCurrentIrpStackLocation(
this);
1636 return IoGetNextIrpStackLocation(
const_cast<_IRP*
>(get_CPtr()));
1640 IoCopyCurrentIrpStackLocationToNext(
this);
1644 IoSetNextIrpStackLocation(
this);
1650 ASSERT((uControlFlags) ? (pRoutine !=
nullptr) :
true);
1652 ASSERT(pIrpStack !=
nullptr);
1653 pIrpStack->CompletionRoutine = pRoutine;
1654 pIrpStack->Context = pCompletionContext;
1655 pIrpStack->Control = uControlFlags;
1657 void SetCompletionRoutine(PIO_COMPLETION_ROUTINE pRoutine,
void* pCompletionContext,
bool bInvokeOnSuccess,
bool bInvokeOnError,
bool bInvokeOnCancel)
1660 IoSetCompletionRoutine(
this,
1686 RemoveEntryList(&pIrp->Tail.Overlay.ListEntry);
1707 if (pIrp ==
nullptr)
1728 ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL);
1741 NTSTATUS CreateFile(OBJECT_ATTRIBUTES& objectAttributes, IO_STATUS_BLOCK& ioStatusBlock)
1744 return ZwCreateFile(
1746 SYNCHRONIZE | FILE_APPEND_DATA,
1750 FILE_ATTRIBUTE_NORMAL,
1751 FILE_SHARE_READ | FILE_SHARE_WRITE,
1753 FILE_SYNCHRONOUS_IO_NONALERT,
1759 NTSTATUS
WriteFile(IO_STATUS_BLOCK* pIoStatusBlock, PVOID pBuffer, ULONG nLength)
1792 NTSTATUS
WriteValue(IN PCWSTR ValueName, IN ULONG ValueType, IN PVOID ValueData, IN ULONG ValueLength)
1798 ValueName, ValueType, ValueData, ValueLength);
1805 NTSTATUS
QueryValues(RTL_QUERY_REGISTRY_TABLE* pQueryTable, IN PVOID pContext =
nullptr, IN PVOID pEnvironment =
nullptr)
1812 return WriteValue(ValueName, REG_SZ, str.Buffer, str.Length +
sizeof(WCHAR));
1818 return WriteValue(ValueName, REG_SZ, str.Buffer, str.Length +
sizeof(WCHAR));
1835 IoDeleteDevice(
this);
1841 IoDetachDevice(
this);
1843 NTSTATUS
GetDeviceProperty(DEVICE_REGISTRY_PROPERTY eDeviceProperty, IN ULONG uBufferLength, OUT PVOID pPropertyBuffer, OUT PULONG puResultLength)
1848 return IoGetDeviceProperty(
this,
1868 ASSERT(pDeviceObj !=
nullptr);
1877 ASSERT(pDeviceObj !=
nullptr);
1878 ASSERT(pDeviceObj->DeviceExtension !=
nullptr);
1886 ASSERT(((UINT_PTR)
this) >
sizeof(*
this) + 256);
1887 ASSERT(m_wSize >
sizeof(*
this));
1888 return(m_pDeviceObject !=
nullptr);
1894 if (_pDeviceObject != m_pDeviceObject)
1901 m_uDeviceSignature = 0;
1908 return m_pDeviceObject;
1915 ASSERT(m_pDeviceObject !=
nullptr);
1916 ASSERT(pDeviceObjectAttach !=
nullptr);
1917 return (
CKeDeviceObject*)IoAttachDeviceToDeviceStack(m_pDeviceObject, pDeviceObjectAttach);
1924 m_pDeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
1933 ULONG m_uDeviceSignature;
1954 ASSERT(pDriverObject !=
nullptr);
1956 RtlInitUnicodeString(&m_ServiceKeyName,
nullptr);
1960 return(m_pDriverObject !=
nullptr);
1964 return m_pDriverObject;
1968 ASSERT(m_pDriverObject !=
nullptr);
1977 IN PUNICODE_STRING puDeviceName OPTIONAL,
1978 IN DEVICE_TYPE eDeviceType,
1979 IN ULONG uDeviceCharacteristics,
1981 OUT PDEVICE_OBJECT *ppDeviceObject)
1985 ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL);
1986 return IoCreateDevice(
1988 uDeviceExtensionSize,
1991 uDeviceCharacteristics,
1999 UNICODE_STRING m_ServiceKeyName;
#define TYPE
Definition: StrT.cpp:38
#define ASSERT(exp)
Definition: cDebugAssert.h:87
NTSYSAPI NTSTATUS NTAPI ObOpenObjectByPointer(PVOID Object, ULONG HandleAttributes, PACCESS_STATE PassedAccessState, ACCESS_MASK DesiredAccess, POBJECT_TYPE ObjectType, KPROCESSOR_MODE AccessMode, PHANDLE Handle)
Documented on MSDN.
#define CKeMem_Free(p, _UTAG)
Definition: cKernel.h:138
NTSYSAPI NTSTATUS NTAPI ZwQueryInformationProcess(IN HANDLE ProcessHandle, IN PROCESSINFOCLASS ProcessInformationClass, OUT PVOID ProcessInformation, IN ULONG ProcessInformationLength, OUT PULONG uReturnLength OPTIONAL)
Documented on MSDN with Caveat.
#define HANDLE_NULL
Definition: cKernel.h:37
int COMPARE_t
Definition: cKernel.h:38
Definition: cKernel.cpp:10
CKeObjectPtr< _FILE_OBJECT > CKeFileObjectPtr
Definition: cKernel.h:1732
CKeObjectPtr< _DEVICE_OBJECT > CKeDeviceObjectPtr
Definition: cKernel.h:1855
__DECL_IMPORT TYPE Decrement(TYPE volatile *pnValue) noexcept
__DECL_IMPORT TYPE Increment(TYPE volatile *pnValue) noexcept
__DECL_IMPORT TYPE ExchangeAdd(TYPE volatile *pnValue, TYPE nValue) noexcept
__DECL_IMPORT TYPE Exchange(TYPE volatile *pnValue, TYPE nValue) noexcept
INT32 __cdecl InterlockedExchangeAdd(INT32 volatile *pDest, INT32 Value) noexcept
Definition: cInterlockedVal.h:160
INT32 __cdecl InterlockedDecrement(INT32 volatile *pDest) noexcept
Definition: cInterlockedVal.h:133
INT32 __cdecl InterlockedCompareExchange(INT32 volatile *pDest, INT32 nValNew, INT32 nValComp) noexcept
Definition: cInterlockedVal.h:49
INT32 __cdecl InterlockedIncrement(INT32 volatile *pDest) noexcept
Definition: cInterlockedVal.h:115
INT32 __cdecl InterlockedExchange(INT32 volatile *pDest, INT32 Value) noexcept
Definition: cInterlockedVal.h:151
Definition: cKernel.h:1858
void Flag_Init_Clear()
Definition: cKernel.h:1920
bool IsDeviceValid() const
Definition: cKernel.h:1881
void DeleteDevice()
Definition: cKernel.h:1898
bool IsDeviceValid(IN PDEVICE_OBJECT _pDeviceObject) const
Definition: cKernel.h:1890
CKeDeviceObject * get_DeviceObject() const
Definition: cKernel.h:1906
void InitDeviceExt(USHORT uSize, PDEVICE_OBJECT pDeviceObj)
Definition: cKernel.h:1865
static const ULONG CKeDeviceExt_SIGNATURE
Definition: cKernel.h:1863
static CKeDeviceExt * GetDeviceExt(PDEVICE_OBJECT pDeviceObj)
Definition: cKernel.h:1875
CKeDeviceObject * AttachToDeviceStack(PDEVICE_OBJECT pDeviceObjectAttach)
Definition: cKernel.h:1911
Definition: cKernel.h:1829
void DetachDeviceStack()
Definition: cKernel.h:1837
NTSTATUS GetDeviceProperty(DEVICE_REGISTRY_PROPERTY eDeviceProperty, IN ULONG uBufferLength, OUT PVOID pPropertyBuffer, OUT PULONG puResultLength)
Definition: cKernel.h:1843
void DeleteDevice()
Definition: cKernel.h:1832
Definition: cKernel.h:1937
Definition: cKernel.h:1943
bool IsDriverValid() const
Definition: cKernel.h:1958
CKeDeviceObject * get_DeviceFirst() const
Definition: cKernel.h:1966
NTSTATUS CreateDevice(ULONG uDeviceExtensionSize, IN PUNICODE_STRING puDeviceName OPTIONAL, IN DEVICE_TYPE eDeviceType, IN ULONG uDeviceCharacteristics, IN bool bExclusive, OUT PDEVICE_OBJECT *ppDeviceObject)
Definition: cKernel.h:1976
CKeDriverObject * get_DriverObject() const
Definition: cKernel.h:1962
CKeStringU & get_RegistryPath()
Definition: cKernel.h:1971
void InitDriver(PDRIVER_OBJECT pDriverObject)
Definition: cKernel.h:1951
Definition: cKernel.h:215
void DestroyThis()
Definition: cKernel.h:219
Definition: cKernel.h:802
void InitEvent()
Definition: cKernel.h:805
LONG SetEvent()
Definition: cKernel.h:814
NTSTATUS WaitForEvent()
Definition: cKernel.h:819
void ClearEvent()
Definition: cKernel.h:809
Definition: cKernel.h:1735
NTSTATUS WriteFile(IO_STATUS_BLOCK *pIoStatusBlock, PVOID pBuffer, ULONG nLength)
Definition: cKernel.h:1759
Definition: cKernel.h:1722
CKeDeviceObject * get_RelatedDeviceObject()
Definition: cKernel.h:1725
Definition: cKernel.h:705
HANDLE * get_HandlePtr()
Definition: cKernel.h:721
HANDLE m_Handle
Definition: cKernel.h:756
~CKeHandle()
Definition: cKernel.h:714
NTSTATUS CloseHandle()
Definition: cKernel.h:726
NTSTATUS OpenByPointer(PVOID pObject, ULONG uHandleAttributes=OBJ_KERNEL_HANDLE, PACCESS_STATE pPassedAccessState=nullptr, ACCESS_MASK uDesiredAccess=FILE_ANY_ACCESS, POBJECT_TYPE pObjectType=nullptr, KPROCESSOR_MODE eAccessMode=KernelMode)
Definition: cKernel.h:734
CKeHandle(HANDLE Handle=NULL)
Definition: cKernel.h:711
Definition: cKernel.h:1546
void SkipStackLocation()
Definition: cKernel.h:1623
NTSTATUS CallDriver(IN PDEVICE_OBJECT pDeviceObject)
Definition: cKernel.h:1608
void CopyStackLocationToNext()
Definition: cKernel.h:1638
NTSTATUS get_IoStatus() const
Definition: cKernel.h:1552
SIZE_T get_IoInformationSize() const
Definition: cKernel.h:1557
void CompleteRequestStatus(NTSTATUS lStatus=STATUS_SUCCESS, ULONG_PTR uInformation=0, CCHAR cPriorityBoost=IO_NO_INCREMENT)
Definition: cKernel.h:1602
void CompleteRequest(CCHAR cPriorityBoost=IO_NO_INCREMENT)
Definition: cKernel.h:1595
PVOID get_AssocSystemBuffer() const
Definition: cKernel.h:1562
void RemoveIrpFromQueue()
Definition: cKernel.h:1573
void FreeIrp()
Definition: cKernel.h:1568
void SetCompletionRoutine(PIO_COMPLETION_ROUTINE pRoutine, void *pCompletionContext, bool bInvokeOnSuccess, bool bInvokeOnError, bool bInvokeOnCancel)
Definition: cKernel.h:1657
NTSTATUS SkipStackLocation(PDEVICE_OBJECT pLowerDeviceObject)
Definition: cKernel.h:1628
void SetNextStackLocation()
Definition: cKernel.h:1642
void SetCompletionRoutine(PIO_COMPLETION_ROUTINE pRoutine, void *pCompletionContext, UCHAR uControlFlags)
Definition: cKernel.h:1646
BOOLEAN CancelIrp()
Definition: cKernel.h:1583
void MarkIrpPending()
Definition: cKernel.h:1588
PIO_STACK_LOCATION get_StackLocation() const
Definition: cKernel.h:1618
PIO_STACK_LOCATION get_NextStackLocation() const
Definition: cKernel.h:1634
PDRIVER_CANCEL SetCancelRoutine(PDRIVER_CANCEL pCancelRoutine=nullptr)
Definition: cKernel.h:1578
Definition: cKernel.h:261
LONG Increment()
Definition: cKernel.h:271
void Init(LONG lVal=0)
Definition: cKernel.h:267
LONG ExchangeAdd(LONG lValAdd)
Definition: cKernel.h:283
LONG m_lVal
Definition: cKernel.h:265
LONG Decrement()
Definition: cKernel.h:275
LONG Exchange(LONG lVal=0)
Definition: cKernel.h:279
LONG ExchangeIf(LONG lValCompare, LONG lVal=0)
Definition: cKernel.h:287
Definition: cKernel.h:378
CKeInterlockedPtrX(TYPE *pVal=nullptr)
Definition: cKernel.h:381
Definition: cKernel.h:346
TYPE * Exchange(TYPE *pVal=nullptr)
Definition: cKernel.h:356
void InitPtr(TYPE *pVal=nullptr)
Definition: cKernel.h:352
TYPE * ExchangeIf(TYPE *pValCompare, TYPE *pVal=nullptr)
Definition: cKernel.h:361
TYPE *& InitRef()
Definition: cKernel.h:370
TYPE * m_pVal
Definition: cKernel.h:350
Definition: cKernel.h:1670
void AddIrpToHead(IN PIRP pIrp)
Definition: cKernel.h:1694
CKeListT< CKeIRP, offsetof(CKeIRP, Tail.Overlay.ListEntry) > m_queue
Definition: cKernel.h:1714
~CKeIrpQueue()
Definition: cKernel.h:1679
void CompleteIrpQueue(IN CCHAR cPriorityBoost=IO_SERIAL_INCREMENT)
Definition: cKernel.h:1700
CKeIrpQueue()
Definition: cKernel.h:1675
static void RemoveIrpFromQueue(IN PIRP pIrp)
Definition: cKernel.h:1683
void AddIrpToQueue(IN PIRP pIrp)
Definition: cKernel.h:1688
Definition: cKernel.h:1427
void RemoveFromList()
Definition: cKernel.h:1435
bool IsListLinked() const
Definition: cKernel.h:1431
CKeList m_ListEntry
Definition: cKernel.h:1440
Definition: cKernel.h:1357
TYPE * get_Head() const
Definition: cKernel.h:1374
static TYPE * GetCast(PLIST_ENTRY pObj)
Definition: cKernel.h:1362
bool IsLast(TYPE *pObj) const
Definition: cKernel.h:1387
void DestroyList()
Definition: cKernel.h:1391
TYPE * GetNext(TYPE *pObj) const
Definition: cKernel.h:1417
static PLIST_ENTRY GetCast(TYPE *pObj)
Definition: cKernel.h:1368
TYPE * RemoveHead()
Definition: cKernel.h:1379
void AddTail(TYPE *pObj)
Definition: cKernel.h:1409
void AddHead(TYPE *pObj)
Definition: cKernel.h:1405
void AddTailLocked(TYPE *pObj, PKSPIN_LOCK pSpinLock)
Definition: cKernel.h:1413
Definition: cKernel.h:1262
void AddTailLocked(PLIST_ENTRY pObj, PKSPIN_LOCK pSpinLock)
Definition: cKernel.h:1316
PLIST_ENTRY get_Prev() const
Definition: cKernel.h:1335
PLIST_ENTRY RemoveHead()
Definition: cKernel.h:1294
void InitList()
Definition: cKernel.h:1269
bool IsListLinked() const
Definition: cKernel.h:1326
PLIST_ENTRY get_Next() const
Definition: cKernel.h:1340
void AddTail(PLIST_ENTRY pObj)
Definition: cKernel.h:1309
void RemoveFromList()
Definition: cKernel.h:1345
void AddHead(PLIST_ENTRY pObj)
Definition: cKernel.h:1302
bool IsListEmptyX() const
Definition: cKernel.h:1274
int get_Count() const
Definition: cKernel.h:1283
PLIST_ENTRY get_Head() const
Definition: cKernel.h:1278
Definition: cKernel.h:143
TYPE * m_p
Definition: cKernel.h:147
void Free()
Definition: cKernel.h:181
bool IsValidMem() const
Definition: cKernel.h:195
TYPE * DetachMem()
Definition: cKernel.h:188
void FreeLast()
Definition: cKernel.h:175
NTSTATUS AllocMemQuota(POOL_TYPE ePoolType, SIZE_T nNumberOfBytes=sizeof(TYPE))
Definition: cKernel.h:159
TYPE * operator->()
Definition: cKernel.h:207
bool AllocMem(POOL_TYPE ePoolType, SIZE_T nNumberOfBytes=sizeof(TYPE))
Definition: cKernel.h:153
void InitMem(TYPE *p=nullptr)
Definition: cKernel.h:149
Definition: cKernel.h:604
bool IsValidObj() const
Definition: cKernel.h:665
TYPE * operator->()
Definition: cKernel.h:677
void ReleaseObject()
Definition: cKernel.h:638
NTSTATUS ReferenceByHandle(IN HANDLE Handle, IN ACCESS_MASK uDesiredAccess=FILE_ANY_ACCESS, IN POBJECT_TYPE pObjectType=nullptr, IN KPROCESSOR_MODE eAccessMode=KernelMode, OUT POBJECT_HANDLE_INFORMATION pHandleInformation=nullptr)
Definition: cKernel.h:615
TYPE ** get_ObjectPPtr()
Definition: cKernel.h:657
void ReferenceObject()
Definition: cKernel.h:632
CKeObjectPtr(TYPE *pObject=nullptr)
Definition: cKernel.h:610
CKeObject< TYPE > * get_ObjectPtr() const
Definition: cKernel.h:661
CKeObject< TYPE > * DetachObject()
Definition: cKernel.h:645
void ReleaseLast()
Definition: cKernel.h:651
Definition: cKernel.h:1447
TYPE * RemoveFreeObj()
Definition: cKernel.h:1517
void AddUsedObj(TYPE *pObj)
Definition: cKernel.h:1513
static TYPE * GetCast(PLIST_ENTRY pObj)
Definition: cKernel.h:1451
void AddFreeObjZ(TYPE *pObj)
Definition: cKernel.h:1487
bool IsFreeListEmpty() const
Definition: cKernel.h:1469
void DestroyUsedList()
Definition: cKernel.h:1501
bool IsUsedListEmpty() const
Definition: cKernel.h:1473
bool IsUsedLast(TYPE *pObj) const
Definition: cKernel.h:1522
CKeListT< TYPE, _OFFSET_ENTRY > m_UsedList
Definition: cKernel.h:1539
TYPE * get_UsedFirst() const
Definition: cKernel.h:1527
int get_FreeCount()
Definition: cKernel.h:1477
int get_UsedCount()
Definition: cKernel.h:1482
CKeListT< TYPE, _OFFSET_ENTRY > m_FreeList
Definition: cKernel.h:1538
void InitPool()
Definition: cKernel.h:1463
void AddFreeObj(TYPE *pObj)
Definition: cKernel.h:1509
CKeSpinLock m_SpinLock
Definition: cKernel.h:1540
TYPE * GetNext(TYPE *pObj) const
Definition: cKernel.h:1532
static PLIST_ENTRY GetCast(TYPE *pObj)
Definition: cKernel.h:1457
void DestroyFreeList()
Definition: cKernel.h:1496
Definition: cKernel.h:1776
NTSTATUS WriteValueStr(IN PCWSTR ValueName, UNICODE_STRING &str)
Definition: cKernel.h:1810
PWSTR m_pPath
e.g. L"SERIALCOMM"
Definition: cKernel.h:1823
NTSTATUS WriteValueStr(IN PCWSTR ValueName, const WCHAR *pStr)
Definition: cKernel.h:1814
NTSTATUS QueryValues(RTL_QUERY_REGISTRY_TABLE *pQueryTable, IN PVOID pContext=nullptr, IN PVOID pEnvironment=nullptr)
Definition: cKernel.h:1805
CKeRegistry(ULONG uRelativeTo, PWSTR pPath)
Definition: cKernel.h:1779
NTSTATUS WriteValue(IN PCWSTR ValueName, IN ULONG ValueType, IN PVOID ValueData, IN ULONG ValueLength)
Definition: cKernel.h:1792
NTSTATUS DeleteValue(IN PCWSTR ValueName=nullptr)
Definition: cKernel.h:1800
NTSTATUS CreateKey()
Definition: cKernel.h:1784
ULONG m_uRelativeTo
RTL_REGISTRY_ABSOLUTE, RTL_REGISTRY_DEVICEMAP, RTL_REGISTRY_MAXIMUM, etc.
Definition: cKernel.h:1822
NTSTATUS CheckKey()
Definition: cKernel.h:1788
Definition: cKernel.h:435
CKeSpinLockDpcLevel(PKSPIN_LOCK pSpinLock)
Definition: cKernel.h:442
~CKeSpinLockDpcLevel()
Definition: cKernel.h:449
PKSPIN_LOCK m_pSpinLock
Must keep a pointer to it to auto unlock on destructor.
Definition: cKernel.h:440
Definition: cKernel.h:458
void Add(ULONG uDelta=1)
Definition: cKernel.h:471
void Subtract(ULONG uDelta=1)
Definition: cKernel.h:476
bool IsZero()
Definition: cKernel.h:481
void InitLargeInteger()
Definition: cKernel.h:466
ULONG get_Low() const
Definition: cKernel.h:487
Definition: cKernel.h:410
~CKeSpinLockLock()
Definition: cKernel.h:428
KIRQL m_OldIrql
IRQL before the lock.
Definition: cKernel.h:415
PKSPIN_LOCK m_pSpinLock
Must keep a pointer to it to auto unlock on destructor.
Definition: cKernel.h:414
CKeSpinLockLock(PKSPIN_LOCK pSpinLock)
Definition: cKernel.h:417
Definition: cKernel.h:389
void InitSpinLock()
Definition: cKernel.h:395
KSPIN_LOCK m_SpinLock
Definition: cKernel.h:393
Definition: cKernel.h:1115
NTSTATUS FromUnicode(PUNICODE_STRING pStr, bool bAlloc=false)
Definition: cKernel.h:1176
NTSTATUS AppendStr(const char *pStr, USHORT uLenStr)
Definition: cKernel.h:1182
void InitBuffer(char *pBuffer, USHORT uMaximumLength)
Definition: cKernel.h:1131
void FreeSys()
Definition: cKernel.h:1249
NTSTATUS AppendStr(const WCHAR *pStr)
Definition: cKernel.h:1244
bool IsValidStr() const
Definition: cKernel.h:1138
NTSTATUS AppendStr(const ANSI_STRING &str)
Definition: cKernel.h:1204
NTSTATUS AppendStr(const WCHAR *pStr, USHORT uLenStr)
Definition: cKernel.h:1216
NTSTATUS AppendStr(const char *pStr)
Definition: cKernel.h:1209
void InitStatic(const char *pStr)
Definition: cKernel.h:1126
void InitStr()
Definition: cKernel.h:1120
NTSTATUS ToInteger(ULONG &uValue, ULONG nBase=10) const
Definition: cKernel.h:1146
Definition: cKernel.h:835
NTSTATUS AppendInteger(ULONG uValue, ULONG uBase=10)
Definition: cKernel.h:943
COMPARE_t CompareStr(const UNICODE_STRING &rString2, BOOLEAN bCaseInSensitive=false) const
Definition: cKernel.h:902
void InitBufferZ(PWSTR pBuffer, USHORT uMaximumLength)
Definition: cKernel.h:875
NTSTATUS FromAnsi(PANSI_STRING pStr, bool bAlloc=false)
Definition: cKernel.h:920
void UpcaseString()
Definition: cKernel.h:839
NTSTATUS FromInt64(IN ULONGLONG Value, IN ULONG nBase=10)
Definition: cKernel.h:916
NTSTATUS ToInteger(ULONG &uValue, ULONG nBase=10) const
Definition: cKernel.h:911
bool IsValidStr() const
Definition: cKernel.h:881
void AppendStr(NTSTATUS &lStatus, PCWSTR pwSource)
Definition: cKernel.h:935
void FreeSys()
Definition: cKernel.h:953
void InitBuffer(PWSTR pBuffer, USHORT uMaximumLength)
Definition: cKernel.h:868
NTSTATUS FromInteger(IN ULONG uValue, IN ULONG uBase=10)
Definition: cKernel.h:907
PWSTR DetachStr()
Definition: cKernel.h:893
void InitStatic(const WCHAR *pStr, USHORT wLength)
Definition: cKernel.h:851
NTSTATUS AppendStr(const UNICODE_STRING &str)
Definition: cKernel.h:925
NTSTATUS AppendStr(PCWSTR pwSource)
Definition: cKernel.h:930
void InitStatic(const WCHAR *pStr)
Definition: cKernel.h:859
void InitStr()
Definition: cKernel.h:844
Definition: cKernel.h:964
void AppendInteger(NTSTATUS &lStatus, ULONG uValue, ULONG uBase=10)
Definition: cKernel.h:1063
CKeStringU()
Definition: cKernel.h:972
NTSTATUS AppendStr(PCWSTR pStr)
Definition: cKernel.h:1024
void AppendStr(NTSTATUS &lStatus, const UNICODE_STRING &str)
Definition: cKernel.h:1046
void AppendStr(NTSTATUS &lStatus, PCWSTR pStr, USHORT nLengthStr)
Definition: cKernel.h:1040
NTSTATUS AppendStr(PCWSTR pStr, USHORT nLengthStr)
Definition: cKernel.h:992
CKeStringU(PCWSTR pStr)
Definition: cKernel.h:976
static const ULONG CKeStringU_TAG
Definition: cKernel.h:970
void AppendStr(NTSTATUS &lStatus, PCWSTR pStr)
Definition: cKernel.h:1034
NTSTATUS CreateStr(const UNICODE_STRING &str)
Definition: cKernel.h:1093
void FreeString()
Definition: cKernel.h:984
NTSTATUS AppendInteger(ULONG uValue, ULONG uBase=10)
Definition: cKernel.h:1053
NTSTATUS CreateStr(PCWSTR pStr)
Definition: cKernel.h:1097
NTSTATUS AppendStr(const UNICODE_STRING &str)
Definition: cKernel.h:1029
void FreeStringLast()
Definition: cKernel.h:1104
~CKeStringU()
Definition: cKernel.h:980
NTSTATUS CreateStr(PCWSTR pStr, USHORT nLengthStr)
Definition: cKernel.h:1072
Definition: cKernel.h:496
int get_AgeSec() const
Definition: cKernel.h:511
void InitTime()
Definition: cKernel.h:503
void GetTimeFields(PTIME_FIELDS pTimeFields)
Definition: cKernel.h:531
LARGE_INTEGER m_TimeVal
very high precision time.
Definition: cKernel.h:537
void MakeLocalTime()
Definition: cKernel.h:520
void QuerySystemTime()
Definition: cKernel.h:507
Definition: cKernel.h:762
void CancelTimerEx()
Definition: cKernel.h:789
void InitTimer(IN PKDEFERRED_ROUTINE DeferredRoutine, IN PVOID DeferredContext)
Definition: cKernel.h:766
KDPC m_Dpc
Definition: cKernel.h:796
void CancelTimer()
Definition: cKernel.h:785
void SetTimer(LARGE_INTEGER &dueTime)
Definition: cKernel.h:771
void SetTimerEx(LARGE_INTEGER &dueTime, ULONG period)
Definition: cKernel.h:778
KTIMER m_Timer
Definition: cKernel.h:795