mirror of
https://github.com/reactos/reactos.git
synced 2024-07-06 04:35:07 +00:00
- Move includes to a common header- Implement IKsDevice interface stubs
- Add a DriverEntry - Partly implement KsAllocateObjectHeader - Check for IID_IUnknown in KoCreateInstance svn path=/trunk/; revision=39524
This commit is contained in:
parent
77f7338705
commit
919e4f45d7
|
@ -1,10 +1,5 @@
|
|||
/* ===============================================================
|
||||
Allocator Functions
|
||||
*/
|
||||
#include "priv.h"
|
||||
|
||||
#include <ntddk.h>
|
||||
#include <debug.h>
|
||||
#include <ks.h>
|
||||
|
||||
/*
|
||||
@unimplemented
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
#include <ntddk.h>
|
||||
#include <debug.h>
|
||||
#include <ks.h>
|
||||
#include "priv.h"
|
||||
|
||||
|
||||
#if 0
|
||||
typedef struct
|
||||
{
|
||||
|
|
|
@ -1,10 +1,4 @@
|
|||
/* ===============================================================
|
||||
Clock Functions
|
||||
*/
|
||||
|
||||
#include <ntddk.h>
|
||||
#include <debug.h>
|
||||
#include <ks.h>
|
||||
#include "priv.h"
|
||||
|
||||
typedef struct
|
||||
{
|
||||
|
|
|
@ -1,14 +1,4 @@
|
|||
/*
|
||||
KsCreatePin
|
||||
KsValidateConnectRequest
|
||||
KsPinPropertyHandler
|
||||
KsPinDataIntersection
|
||||
KsHandleSizedListQuery
|
||||
*/
|
||||
|
||||
#include <ntddk.h>
|
||||
#include <debug.h>
|
||||
#include <ks.h>
|
||||
#include "priv.h"
|
||||
|
||||
KSDDKAPI NTSTATUS NTAPI
|
||||
KsCreatePin(
|
||||
|
|
|
@ -1,32 +1,218 @@
|
|||
#include <ntddk.h>
|
||||
#include <debug.h>
|
||||
#include <ks.h>
|
||||
|
||||
#include "ksiface.h"
|
||||
#include "ksfunc.h"
|
||||
#include "priv.h"
|
||||
|
||||
typedef struct
|
||||
{
|
||||
IKsDeviceVtbl *lpVtbl;
|
||||
|
||||
LONG ref;
|
||||
|
||||
KSDEVICE KsDevice;
|
||||
|
||||
}IKsDeviceImpl;
|
||||
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
IKsDevice_fnQueryInterface(
|
||||
IN IKsDevice * iface,
|
||||
REFIID InterfaceId,
|
||||
PVOID* Interface)
|
||||
{
|
||||
IKsDeviceImpl * This = (IKsDeviceImpl*)iface;
|
||||
|
||||
DPRINT1("IKsDevice_fnQueryInterface %p\n", This);
|
||||
return STATUS_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
ULONG
|
||||
NTAPI
|
||||
IKsDevice_fnAddRef(
|
||||
IN IKsDevice * iface)
|
||||
{
|
||||
IKsDeviceImpl * This = (IKsDeviceImpl*)iface;
|
||||
|
||||
return InterlockedIncrement(&This->ref);
|
||||
}
|
||||
|
||||
ULONG
|
||||
NTAPI
|
||||
IKsDevice_fnRelease(
|
||||
IN IKsDevice * iface)
|
||||
{
|
||||
IKsDeviceImpl * This = (IKsDeviceImpl*)iface;
|
||||
|
||||
InterlockedDecrement(&This->ref);
|
||||
|
||||
if (This->ref == 0)
|
||||
{
|
||||
ExFreePoolWithTag(This, TAG_KSDEVICE);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return This->ref;
|
||||
}
|
||||
|
||||
|
||||
|
||||
KSDEVICE *
|
||||
NTAPI
|
||||
IKsDevice_fnGetStruct(
|
||||
IN IKsDevice * iface)
|
||||
{
|
||||
IKsDeviceImpl * This = (IKsDeviceImpl*)iface;
|
||||
|
||||
return &This->KsDevice;
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
IKsDevice_fnInitializeObjectBag(
|
||||
IN IKsDevice * iface,
|
||||
IN struct KSIOBJECTBAG *Bag,
|
||||
IN KMUTANT * Mutant)
|
||||
{
|
||||
IKsDeviceImpl * This = (IKsDeviceImpl*)iface;
|
||||
|
||||
DPRINT1("IKsDevice_fnInitializeObjectBag %p\n", This);
|
||||
return STATUS_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
IKsDevice_fnAcquireDevice(
|
||||
IN IKsDevice * iface)
|
||||
{
|
||||
IKsDeviceImpl * This = (IKsDeviceImpl*)iface;
|
||||
|
||||
DPRINT1("IKsDevice_fnAcquireDevice %p\n", This);
|
||||
return STATUS_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
IKsDevice_fnReleaseDevice(
|
||||
IN IKsDevice * iface)
|
||||
{
|
||||
IKsDeviceImpl * This = (IKsDeviceImpl*)iface;
|
||||
|
||||
DPRINT1("IKsDevice_fnReleaseDevice %p\n", This);
|
||||
return STATUS_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
IKsDevice_fnGetAdapterObject(
|
||||
IN IKsDevice * iface,
|
||||
IN PADAPTER_OBJECT Object,
|
||||
IN PULONG Unknown1,
|
||||
IN PULONG Unknown2)
|
||||
{
|
||||
IKsDeviceImpl * This = (IKsDeviceImpl*)iface;
|
||||
|
||||
DPRINT1("IKsDevice_fnGetAdapterObject %p\n", This);
|
||||
return STATUS_NOT_IMPLEMENTED;
|
||||
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
IKsDevice_fnAddPowerEntry(
|
||||
IN IKsDevice * iface,
|
||||
IN struct KSPOWER_ENTRY * Entry,
|
||||
IN IKsPowerNotify* Notify)
|
||||
{
|
||||
IKsDeviceImpl * This = (IKsDeviceImpl*)iface;
|
||||
|
||||
DPRINT1("IKsDevice_fnAddPowerEntry %p\n", This);
|
||||
return STATUS_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
IKsDevice_fnRemovePowerEntry(
|
||||
IN IKsDevice * iface,
|
||||
IN struct KSPOWER_ENTRY * Entry)
|
||||
{
|
||||
IKsDeviceImpl * This = (IKsDeviceImpl*)iface;
|
||||
|
||||
DPRINT1("IKsDevice_fnRemovePowerEntry %p\n", This);
|
||||
return STATUS_NOT_IMPLEMENTED;
|
||||
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
IKsDevice_fnPinStateChange(
|
||||
IN IKsDevice * iface,
|
||||
IN KSPIN Pin,
|
||||
IN PIRP Irp,
|
||||
IN KSSTATE OldState,
|
||||
IN KSSTATE NewState)
|
||||
{
|
||||
IKsDeviceImpl * This = (IKsDeviceImpl*)iface;
|
||||
|
||||
DPRINT1("IKsDevice_fnPinStateChange %p\n", This);
|
||||
return STATUS_NOT_IMPLEMENTED;
|
||||
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
IKsDevice_fnArbitrateAdapterChannel(
|
||||
IN IKsDevice * iface,
|
||||
IN ULONG ControlCode,
|
||||
IN IO_ALLOCATION_ACTION Action,
|
||||
IN PVOID Context)
|
||||
{
|
||||
IKsDeviceImpl * This = (IKsDeviceImpl*)iface;
|
||||
|
||||
DPRINT1("IKsDevice_fnArbitrateAdapterChannel %p\n", This);
|
||||
return STATUS_NOT_IMPLEMENTED;
|
||||
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
IKsDevice_fnCheckIoCapability(
|
||||
IN IKsDevice * iface,
|
||||
IN ULONG Unknown)
|
||||
{
|
||||
IKsDeviceImpl * This = (IKsDeviceImpl*)iface;
|
||||
|
||||
DPRINT1("IKsDevice_fnCheckIoCapability %p\n", This);
|
||||
return STATUS_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
static IKsDeviceVtbl vt_IKsDevice =
|
||||
{
|
||||
IKsDevice_fnQueryInterface,
|
||||
IKsDevice_fnAddRef,
|
||||
IKsDevice_fnRelease,
|
||||
IKsDevice_fnGetStruct,
|
||||
IKsDevice_fnInitializeObjectBag,
|
||||
IKsDevice_fnAcquireDevice,
|
||||
IKsDevice_fnReleaseDevice,
|
||||
IKsDevice_fnGetAdapterObject,
|
||||
IKsDevice_fnAddPowerEntry,
|
||||
IKsDevice_fnRemovePowerEntry,
|
||||
IKsDevice_fnPinStateChange,
|
||||
IKsDevice_fnArbitrateAdapterChannel,
|
||||
IKsDevice_fnCheckIoCapability
|
||||
};
|
||||
|
||||
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
NewIKsDevice(IKsDevice** OutDevice)
|
||||
{
|
||||
IKsDeviceImpl * This;
|
||||
|
||||
This = ExAllocatePoolWithTag(NonPagedPool, sizeof(IKsDeviceImpl), 0x12345678); //FIX TAG
|
||||
This = ExAllocatePoolWithTag(NonPagedPool, sizeof(IKsDeviceImpl), TAG_KSDEVICE);
|
||||
if (!This)
|
||||
return STATUS_INSUFFICIENT_RESOURCES;
|
||||
|
||||
This->ref = 1;
|
||||
//This->lpVtbl = &vt_IKsDevice;
|
||||
This->lpVtbl = &vt_IKsDevice;
|
||||
|
||||
*OutDevice = (IKsDevice*)This;
|
||||
return STATUS_SUCCESS;
|
||||
|
|
|
@ -1,10 +1,19 @@
|
|||
#include <ntddk.h>
|
||||
#include <debug.h>
|
||||
#include <ks.h>
|
||||
#include "priv.h"
|
||||
|
||||
#include "ksfunc.h"
|
||||
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
DriverEntry(
|
||||
IN PDRIVER_OBJECT Driver,
|
||||
IN PUNICODE_STRING Registry_path
|
||||
)
|
||||
{
|
||||
DPRINT1("ks.sys loaded\n");
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/*
|
||||
@unimplemented
|
||||
*/
|
||||
|
|
|
@ -1,6 +1,4 @@
|
|||
#include <ntddk.h>
|
||||
#include <debug.h>
|
||||
#include <ks.h>
|
||||
#include "priv.h"
|
||||
|
||||
/* ===============================================================
|
||||
Event Functions
|
||||
|
|
|
@ -3,11 +3,7 @@
|
|||
IRP Helpers
|
||||
*/
|
||||
|
||||
#include <ntddk.h>
|
||||
#include <debug.h>
|
||||
#include <ks.h>
|
||||
|
||||
#define TAG(A, B, C, D) (IN ULONG)(((A)<<0) + ((B)<<8) + ((C)<<16) + ((D)<<24))
|
||||
#include "priv.h"
|
||||
|
||||
/*
|
||||
@unimplemented
|
||||
|
@ -145,32 +141,31 @@ KsAllocateObjectCreateItem(
|
|||
*/
|
||||
KSDDKAPI NTSTATUS NTAPI
|
||||
KsAllocateObjectHeader(
|
||||
OUT PVOID Header,
|
||||
OUT KSOBJECT_HEADER *Header,
|
||||
IN ULONG ItemsCount,
|
||||
IN PKSOBJECT_CREATE_ITEM ItemsList OPTIONAL,
|
||||
IN PIRP Irp,
|
||||
IN KSDISPATCH_TABLE* Table)
|
||||
{
|
||||
/* NOTE: PKSOBJECT_HEADER is not defined yet */
|
||||
#if 0
|
||||
PKSOBJECT_HEADER object_header;
|
||||
PKSIOBJECT_HEADER ObjectHeader;
|
||||
|
||||
/* TODO: Validate parameters */
|
||||
|
||||
object_header = ExAllocatePoolWithTag(PagedPool, sizeof(KSOBJECT_HEADER), TAG('H','O','S','K'));
|
||||
|
||||
if ( ! object_header )
|
||||
ObjectHeader = ExAllocatePoolWithTag(PagedPool, sizeof(KSIOBJECT_HEADER), TAG_KSOBJECT_TAG);
|
||||
if (!ObjectHeader)
|
||||
{
|
||||
return STATUS_INSUFFICIENT_RESOURCES;
|
||||
}
|
||||
|
||||
(PVOID)(*Header) = object_header;
|
||||
RtlZeroMemory(ObjectHeader, sizeof(KSIOBJECT_HEADER));
|
||||
|
||||
/* TODO ... */
|
||||
#endif
|
||||
RtlCopyMemory(&ObjectHeader->DispatchTable, Table, sizeof(KSDISPATCH_TABLE));
|
||||
ObjectHeader->CreateItem = ItemsList;
|
||||
|
||||
//FIXME
|
||||
// copy itemlist
|
||||
|
||||
*Header = ObjectHeader;
|
||||
return STATUS_SUCCESS;
|
||||
|
||||
UNIMPLEMENTED;
|
||||
return STATUS_UNSUCCESSFUL;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -584,11 +579,13 @@ KsInternalIrpDispatcher(
|
|||
IN PDEVICE_OBJECT DeviceObject,
|
||||
IN PIRP Irp)
|
||||
{
|
||||
PIO_STACK_LOCATION IoStack;
|
||||
|
||||
/* TODO - Nothing implemented really yet! */
|
||||
IoStack = IoGetCurrentIrpStackLocation(Irp);
|
||||
|
||||
DPRINT1("KS IRP dispatch function called\n");
|
||||
|
||||
//PKSDISPATCH_TABLE ks_dispatch_table = NULL;
|
||||
DPRINT1("KS IRP dispatch function called with func %x\n", IoStack->MajorFunction);
|
||||
|
||||
/* ks_dispatch_table is the first element in a structure pointed to by FsContext */
|
||||
|
||||
|
|
|
@ -2,11 +2,9 @@
|
|||
Kernel-mode COM
|
||||
*/
|
||||
|
||||
#include <ntddk.h>
|
||||
#include <portcls.h>
|
||||
#include <kcom.h>
|
||||
#include <debug.h>
|
||||
#include "priv.h"
|
||||
|
||||
const GUID IID_IUnknown = {0x00000000, 0x0000, 0x0000, {0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x46}};
|
||||
|
||||
/* http://msdn2.microsoft.com/en-us/library/ms809781.aspx */
|
||||
COMDDKAPI NTSTATUS NTAPI
|
||||
|
@ -24,10 +22,17 @@ KoCreateInstance(
|
|||
|
||||
if ( ClsContext != CLSCTX_KERNEL_SERVER )
|
||||
{
|
||||
DPRINT("FAILED: ClsContext must be CLSCTX_KERNEL_SERVER\n");
|
||||
DPRINT("KoCreateInstance: ClsContext must be CLSCTX_KERNEL_SERVER\n");
|
||||
return STATUS_INVALID_PARAMETER_3;
|
||||
}
|
||||
|
||||
if (IsEqualGUIDAligned(InterfaceId, &IID_IUnknown))
|
||||
{
|
||||
DPRINT("KoCreateInstance: InterfaceId cannot be IID_IUnknown\n");
|
||||
return STATUS_INVALID_PARAMETER_4;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Find the desired interface and create an instance.
|
||||
|
||||
|
|
|
@ -7,8 +7,9 @@ NTSTATUS
|
|||
NTAPI
|
||||
NewIKsDevice(IKsDevice** OutDevice);
|
||||
|
||||
|
||||
|
||||
#define TAG(A, B, C, D) (ULONG)(((A)<<0) + ((B)<<8) + ((C)<<16) + ((D)<<24))
|
||||
#define TAG_KSDEVICE TAG('K', 'S', 'E', 'D')
|
||||
#define TAG_KSOBJECT_TAG TAG('K', 'S', 'O', 'H')
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -4,7 +4,15 @@
|
|||
#include <ntddk.h>
|
||||
#include <ks.h>
|
||||
|
||||
#if !defined(DEFINE_ABSTRACT_UNKNOWN)
|
||||
|
||||
#define DEFINE_ABSTRACT_UNKNOWN() \
|
||||
STDMETHOD_(NTSTATUS, QueryInterface)(THIS_ \
|
||||
REFIID InterfaceId, \
|
||||
PVOID* Interface)PURE; \
|
||||
STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
|
||||
STDMETHOD_(ULONG,Release)(THIS) PURE;
|
||||
#endif
|
||||
|
||||
/*****************************************************************************
|
||||
* IKsFilterFactory
|
||||
|
@ -14,16 +22,13 @@
|
|||
#undef INTERFACE
|
||||
#define INTERFACE IKsFilterFactory
|
||||
|
||||
struct KSFILTERFACTORY;
|
||||
|
||||
DECLARE_INTERFACE_(IKsFilterFactory, IUnknown)
|
||||
{
|
||||
//DEFINE_ABSTRACT_UNKNOWN()
|
||||
DEFINE_ABSTRACT_UNKNOWN()
|
||||
|
||||
STDMETHOD_(struct KSFILTERFACTORY*,GetStruct)(THIS) PURE;
|
||||
STDMETHOD_(KSFILTERFACTORY*,GetStruct)(THIS) PURE;
|
||||
|
||||
STDMETHOD_(NTSTATUS,SetDeviceClassesState)(THIS_
|
||||
IN ULONG Unknown1,
|
||||
IN BOOLEAN Enable)PURE;
|
||||
};
|
||||
|
||||
|
@ -38,12 +43,12 @@ DECLARE_INTERFACE_(IKsFilterFactory, IUnknown)
|
|||
|
||||
DECLARE_INTERFACE_(IKsPowerNotify, IUnknown)
|
||||
{
|
||||
//DEFINE_ABSTRACT_UNKNOWN()
|
||||
DEFINE_ABSTRACT_UNKNOWN()
|
||||
|
||||
STDMETHOD_(ULONG,Sleep)(THIS_
|
||||
STDMETHOD_(VOID,Sleep)(THIS_
|
||||
IN DEVICE_POWER_STATE State) PURE;
|
||||
|
||||
STDMETHOD_(ULONG,Wake)(THIS) PURE;
|
||||
STDMETHOD_(VOID,Wake)(THIS) PURE;
|
||||
};
|
||||
|
||||
|
||||
|
@ -60,27 +65,27 @@ struct KSPOWER_ENTRY;
|
|||
|
||||
DECLARE_INTERFACE_(IKsDevice, IUnknown)
|
||||
{
|
||||
//DEFINE_ABSTRACT_UNKNOWN()
|
||||
DEFINE_ABSTRACT_UNKNOWN()
|
||||
|
||||
STDMETHOD_(struct KSDEVICE*,GetStruct)(THIS) PURE;
|
||||
STDMETHOD_(KSDEVICE*,GetStruct)(THIS) PURE;
|
||||
|
||||
STDMETHOD_(NTSTATUS, InitializeObjectBag)(THIS_
|
||||
IN struct KSIOBJECTBAG *Bag,
|
||||
IN KMUTANT * Mutant) PURE;
|
||||
|
||||
STDMETHOD_(ULONG,AcquireDevice)(THIS) PURE;
|
||||
STDMETHOD_(ULONG,ReleaseDevice)(THIS) PURE;
|
||||
STDMETHOD_(NTSTATUS,AcquireDevice)(THIS) PURE;
|
||||
STDMETHOD_(NTSTATUS,ReleaseDevice)(THIS) PURE;
|
||||
|
||||
STDMETHOD_(VOID, GetAdapterObject)(THIS_
|
||||
STDMETHOD_(NTSTATUS, GetAdapterObject)(THIS_
|
||||
IN PADAPTER_OBJECT Object,
|
||||
IN PULONG Unknown1,
|
||||
IN PULONG Unknown2) PURE;
|
||||
|
||||
STDMETHOD_(VOID, AddPowerEntry)(THIS_
|
||||
STDMETHOD_(NTSTATUS, AddPowerEntry)(THIS_
|
||||
IN struct KSPOWER_ENTRY * Entry,
|
||||
IN struct IKsPowerNotify* Notify)PURE;
|
||||
IN IKsPowerNotify* Notify)PURE;
|
||||
|
||||
STDMETHOD_(VOID, RemovePowerEntry)(THIS_
|
||||
STDMETHOD_(NTSTATUS, RemovePowerEntry)(THIS_
|
||||
IN struct KSPOWER_ENTRY * Entry)PURE;
|
||||
|
||||
STDMETHOD_(NTSTATUS, PinStateChange)(THIS_
|
||||
|
|
18
reactos/drivers/ksfilter/ks/kstypes.h
Normal file
18
reactos/drivers/ksfilter/ks/kstypes.h
Normal file
|
@ -0,0 +1,18 @@
|
|||
#ifndef KSTYPES_H__
|
||||
#define KSTYPES_H__
|
||||
|
||||
typedef struct
|
||||
{
|
||||
KSDISPATCH_TABLE DispatchTable;
|
||||
LIST_ENTRY ListEntry;
|
||||
ACCESS_MASK AccessMask;
|
||||
PKSOBJECT_CREATE_ITEM CreateItem;
|
||||
|
||||
}KSIOBJECT_HEADER, *PKSIOBJECT_HEADER;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#endif
|
|
@ -1,11 +1,9 @@
|
|||
#include "priv.h"
|
||||
|
||||
/* ===============================================================
|
||||
Method Functions
|
||||
*/
|
||||
|
||||
#include <ntddk.h>
|
||||
#include <debug.h>
|
||||
#include <ks.h>
|
||||
|
||||
/*
|
||||
@unimplemented
|
||||
*/
|
||||
|
|
19
reactos/drivers/ksfilter/ks/priv.h
Normal file
19
reactos/drivers/ksfilter/ks/priv.h
Normal file
|
@ -0,0 +1,19 @@
|
|||
#ifndef PRIV_H__
|
||||
#define PRIV_H__
|
||||
|
||||
#include <ntddk.h>
|
||||
#include <debug.h>
|
||||
#include <ks.h>
|
||||
#include <portcls.h>
|
||||
#include <kcom.h>
|
||||
|
||||
#include "ksfunc.h"
|
||||
#include "kstypes.h"
|
||||
#include "ksiface.h"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#endif
|
|
@ -1,6 +1,4 @@
|
|||
#include <ntddk.h>
|
||||
#include <debug.h>
|
||||
#include <ks.h>
|
||||
#include "priv.h"
|
||||
|
||||
/* ===============================================================
|
||||
Property Functions
|
||||
|
|
|
@ -1,12 +1,9 @@
|
|||
#include "priv.h"
|
||||
|
||||
/* ===============================================================
|
||||
Worker Management Functions
|
||||
*/
|
||||
|
||||
#include <ntddk.h>
|
||||
#include <debug.h>
|
||||
#include <ks.h>
|
||||
|
||||
|
||||
typedef struct
|
||||
{
|
||||
KEVENT Event;
|
||||
|
|
Loading…
Reference in a new issue