#include "wdmsys.h" #pragma PAGEDCODE CSystem* CWDMSystem::create(VOID) { return new (NonPagedPool) CWDMSystem; } #pragma PAGEDCODE NTSTATUS CWDMSystem::createDevice(PDRIVER_OBJECT DriverObject, ULONG DeviceExtensionSize, PUNICODE_STRING DeviceName OPTIONAL, DEVICE_TYPE DeviceType, ULONG DeviceCharacteristics, BOOLEAN Reserved, PDEVICE_OBJECT *DeviceObject) { return ::IoCreateDevice(DriverObject,DeviceExtensionSize,DeviceName, DeviceType,DeviceCharacteristics,Reserved,DeviceObject); } #pragma PAGEDCODE VOID CWDMSystem::deleteDevice(PDEVICE_OBJECT DeviceObject) { ::IoDeleteDevice(DeviceObject); } #pragma PAGEDCODE PDEVICE_OBJECT CWDMSystem::attachDevice(PDEVICE_OBJECT SourceDevice,PDEVICE_OBJECT TargetDevice) { return ::IoAttachDeviceToDeviceStack(SourceDevice,TargetDevice); } #pragma PAGEDCODE VOID CWDMSystem::detachDevice(PDEVICE_OBJECT TargetDevice) { ::IoDetachDevice(TargetDevice); } #pragma PAGEDCODE NTSTATUS CWDMSystem::callDriver(PDEVICE_OBJECT DeviceObject,PIRP Irp) { return IoCallDriver(DeviceObject,Irp); } #pragma PAGEDCODE NTSTATUS CWDMSystem::registerDeviceInterface(PDEVICE_OBJECT PhysicalDeviceObject, CONST GUID *InterfaceClassGuid, PUNICODE_STRING ReferenceString, PUNICODE_STRING SymbolicLinkName) { return ::IoRegisterDeviceInterface(PhysicalDeviceObject, InterfaceClassGuid, ReferenceString,SymbolicLinkName); } #pragma PAGEDCODE NTSTATUS CWDMSystem::setDeviceInterfaceState(PUNICODE_STRING SymbolicLinkName, BOOLEAN Enable ) { return ::IoSetDeviceInterfaceState(SymbolicLinkName,Enable); } #pragma PAGEDCODE NTSTATUS CWDMSystem::createSystemThread( OUT PHANDLE ThreadHandle, IN ULONG DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, IN HANDLE ProcessHandle OPTIONAL, OUT PCLIENT_ID ClientId OPTIONAL, IN PKSTART_ROUTINE StartRoutine, IN PVOID StartContext) { return PsCreateSystemThread(ThreadHandle,DesiredAccess,ObjectAttributes, ProcessHandle,ClientId, StartRoutine,StartContext); } #pragma PAGEDCODE NTSTATUS CWDMSystem::terminateSystemThread(IN NTSTATUS ExitStatus) { return PsTerminateSystemThread(ExitStatus); } #pragma PAGEDCODE NTSTATUS CWDMSystem::referenceObjectByHandle( IN HANDLE Handle, IN ACCESS_MASK DesiredAccess, IN POBJECT_TYPE ObjectType OPTIONAL, IN KPROCESSOR_MODE AccessMode, OUT PVOID *Object, OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL ) { return ObReferenceObjectByHandle(Handle,DesiredAccess,ObjectType,AccessMode,Object,HandleInformation); } #pragma PAGEDCODE VOID CWDMSystem::referenceObject(IN PVOID Object) { ObReferenceObject(Object); } #pragma PAGEDCODE VOID CWDMSystem::dereferenceObject(IN PVOID Object) { ObfDereferenceObject(Object); } #pragma PAGEDCODE PDEVICE_OBJECT CWDMSystem::getAttachedDeviceReference(IN PDEVICE_OBJECT DeviceObject) { return ::IoGetAttachedDeviceReference(DeviceObject); } NTKERNELAPI PDEVICE_OBJECT IoGetAttachedDeviceReference( IN PDEVICE_OBJECT DeviceObject ); #pragma PAGEDCODE NTSTATUS CWDMSystem::ZwClose(IN HANDLE Handle) { return ::ZwClose(Handle); } #pragma PAGEDCODE NTSTATUS CWDMSystem::createSymbolicLink(IN PUNICODE_STRING SymbolicLinkName,IN PUNICODE_STRING DeviceName) { return ::IoCreateSymbolicLink(SymbolicLinkName,DeviceName); } #pragma PAGEDCODE NTSTATUS CWDMSystem::deleteSymbolicLink(IN PUNICODE_STRING SymbolicLinkName) { return ::IoDeleteSymbolicLink(SymbolicLinkName); } #pragma PAGEDCODE VOID CWDMSystem::invalidateDeviceRelations(IN PDEVICE_OBJECT DeviceObject,IN DEVICE_RELATION_TYPE Type) { IoInvalidateDeviceRelations(DeviceObject,Type); } #pragma PAGEDCODE NTSTATUS CWDMSystem::getDeviceObjectPointer(IN PUNICODE_STRING ObjectName, IN ACCESS_MASK DesiredAccess, OUT PFILE_OBJECT *FileObject, OUT PDEVICE_OBJECT *DeviceObject) { return IoGetDeviceObjectPointer(ObjectName,DesiredAccess,FileObject,DeviceObject); } #pragma PAGEDCODE VOID CWDMSystem::raiseIrql(IN KIRQL NewIrql,OUT KIRQL* oldIrql) { KeRaiseIrql(NewIrql,oldIrql); }; #pragma PAGEDCODE VOID CWDMSystem::lowerIrql (IN KIRQL NewIrql) { KeLowerIrql(NewIrql); }; #pragma PAGEDCODE KIRQL CWDMSystem::getCurrentIrql () { return KeGetCurrentIrql(); }; #pragma PAGEDCODE VOID CWDMSystem::initializeDeviceQueue(IN PKDEVICE_QUEUE DeviceQueue) { KeInitializeDeviceQueue (DeviceQueue); }; #pragma PAGEDCODE BOOLEAN CWDMSystem::insertDeviceQueue(IN PKDEVICE_QUEUE DeviceQueue,IN PKDEVICE_QUEUE_ENTRY DeviceQueueEntry) { return KeInsertDeviceQueue (DeviceQueue,DeviceQueueEntry); } #pragma PAGEDCODE BOOLEAN CWDMSystem::insertByKeyDeviceQueue(IN PKDEVICE_QUEUE DeviceQueue,IN PKDEVICE_QUEUE_ENTRY DeviceQueueEntry,IN ULONG SortKey) { return KeInsertByKeyDeviceQueue(DeviceQueue,DeviceQueueEntry,SortKey); } #pragma PAGEDCODE PKDEVICE_QUEUE_ENTRY CWDMSystem::removeDeviceQueue(IN PKDEVICE_QUEUE DeviceQueue) { return KeRemoveDeviceQueue (DeviceQueue); } #pragma PAGEDCODE PKDEVICE_QUEUE_ENTRY CWDMSystem::removeByKeyDeviceQueue(IN PKDEVICE_QUEUE DeviceQueue,IN ULONG SortKey) { return KeRemoveByKeyDeviceQueue (DeviceQueue,SortKey); } #pragma PAGEDCODE BOOLEAN CWDMSystem::removeEntryDeviceQueue(IN PKDEVICE_QUEUE DeviceQueue,IN PKDEVICE_QUEUE_ENTRY DeviceQueueEntry) { return KeRemoveEntryDeviceQueue(DeviceQueue,DeviceQueueEntry); } #pragma PAGEDCODE NTSTATUS CWDMSystem::openDeviceRegistryKey(IN PDEVICE_OBJECT DeviceObject, IN ULONG DevInstKeyType, IN ACCESS_MASK DesiredAccess, OUT PHANDLE DevInstRegKey) { return IoOpenDeviceRegistryKey(DeviceObject,DevInstKeyType,DesiredAccess,DevInstRegKey); } #pragma PAGEDCODE NTSTATUS CWDMSystem::ZwQueryValueKey(IN HANDLE KeyHandle, IN PUNICODE_STRING ValueName, IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass, OUT PVOID KeyValueInformation, IN ULONG Length, OUT PULONG ResultLength) { return ZwQueryValueKey(KeyHandle,ValueName,KeyValueInformationClass,KeyValueInformation, Length,ResultLength); } #pragma PAGEDCODE NTSTATUS CWDMSystem::getDeviceProperty( IN PDEVICE_OBJECT DeviceObject, IN DEVICE_REGISTRY_PROPERTY Property, IN ULONG BufferLength, OUT PVOID PropertyBuffer, OUT PULONG ResultLength ) { return IoGetDeviceProperty(DeviceObject,Property,BufferLength,PropertyBuffer,ResultLength); /* // Define PnP Device Property for IoGetDeviceProperty #define DEVICE_PROPERTY_TABSIZE DevicePropertyEnumeratorName+1 WCHAR* DeviceProperty[DEVICE_PROPERTY_TABSIZE]; DeviceProperty[DevicePropertyDeviceDescription] = L"DeviceDesc"; DeviceProperty[DevicePropertyHardwareID] = L"HardwareID"; DeviceProperty[DevicePropertyCompatibleIDs] = L"CompatibleIDs"; DeviceProperty[DevicePropertyBootConfiguration] = L"BootConfiguration"; DeviceProperty[DevicePropertyBootConfigurationTranslated] = L"BootConfigurationTranslated"; DeviceProperty[DevicePropertyClassName] = L"ClassName"; DeviceProperty[DevicePropertyClassGuid] = L"ClassGuid"; DeviceProperty[DevicePropertyDriverKeyName] = L"DriverKeyName"; DeviceProperty[DevicePropertyManufacturer] = L"Manufacturer"; DeviceProperty[DevicePropertyFriendlyName] = L"FriendlyName"; DeviceProperty[DevicePropertyLocationInformation] = L"LocationInformation"; DeviceProperty[DevicePropertyPhysicalDeviceObjectName] = L"PhysicalDeviceObjectName"; DeviceProperty[DevicePropertyBusTypeGuid] = L"BusTypeGuid"; DeviceProperty[DevicePropertyLegacyBusType] = L"LegacyBusType"; DeviceProperty[DevicePropertyBusNumber] = L"BusNumber"; DeviceProperty[DevicePropertyEnumeratorName] = L"EnumeratorName"; if (isWin98()) { // use registry HANDLE hkey; status = IoOpenDeviceRegistryKey(pdo, PLUGPLAY_REGKEY_DEVICE, KEY_READ, &hkey); if (NT_SUCCESS(status)) { // get & report description UNICODE_STRING valname; RtlInitUnicodeString(&valname, L"DeviceDesc"); kernel->RegistryPath = new (NonPagedPool)CUString(RegistryPath); ULONG size = 0; status = ZwQueryValueKey(hkey, &valname, KeyValuePartialInformation, NULL, 0, &size); if (status != STATUS_OBJECT_NAME_NOT_FOUND && size) { // value exists PKEY_VALUE_PARTIAL_INFORMATION vpip = (PKEY_VALUE_PARTIAL_INFORMATION) ExAllocatePool(PagedPool, size); status = ZwQueryValueKey(hkey, &valname, KeyValuePartialInformation, vpip, size, &size); if (NT_SUCCESS(status)) KdPrint((DRIVERNAME " - AddDevice has succeeded for '%ws' device\n", vpip->Data)); ExFreePool(vpip); } // value exists ZwClose(hkey); } // get & report description } // use registry else { // get property status = IoGetDeviceProperty(DeviceObject,DeviceProperty,BufferLength,PropertyBuffer,ResultLength); } // get property */ } #pragma PAGEDCODE VOID CWDMSystem::initializeFastMutex(IN PFAST_MUTEX FastMutex) { ExInitializeFastMutex (FastMutex); } #pragma PAGEDCODE VOID CWDMSystem::acquireFastMutex(IN PFAST_MUTEX FastMutex) { ExAcquireFastMutex (FastMutex); } #pragma PAGEDCODE VOID CWDMSystem::releaseFastMutex(IN PFAST_MUTEX FastMutex) { ExReleaseFastMutex(FastMutex); }