windows-nt/Source/XPSP1/NT/drivers/smartcrd/gempc430/wdmsys.cpp
2020-09-26 16:20:57 +08:00

318 lines
9.3 KiB
C++

#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);
}