diff --git a/reactos/drivers/ksfilter/ks/allocators.c b/reactos/drivers/ksfilter/ks/allocators.c index 68f4eff9edc..21637ae87cf 100644 --- a/reactos/drivers/ksfilter/ks/allocators.c +++ b/reactos/drivers/ksfilter/ks/allocators.c @@ -1,10 +1,5 @@ -/* =============================================================== - Allocator Functions -*/ +#include "priv.h" -#include -#include -#include /* @unimplemented diff --git a/reactos/drivers/ksfilter/ks/bag.c b/reactos/drivers/ksfilter/ks/bag.c index 0f00235186e..c6f288dc764 100644 --- a/reactos/drivers/ksfilter/ks/bag.c +++ b/reactos/drivers/ksfilter/ks/bag.c @@ -1,6 +1,6 @@ -#include -#include -#include +#include "priv.h" + + #if 0 typedef struct { diff --git a/reactos/drivers/ksfilter/ks/clocks.c b/reactos/drivers/ksfilter/ks/clocks.c index 8066157c3ca..bc34145568b 100644 --- a/reactos/drivers/ksfilter/ks/clocks.c +++ b/reactos/drivers/ksfilter/ks/clocks.c @@ -1,10 +1,4 @@ -/* =============================================================== - Clock Functions -*/ - -#include -#include -#include +#include "priv.h" typedef struct { diff --git a/reactos/drivers/ksfilter/ks/connectivity.c b/reactos/drivers/ksfilter/ks/connectivity.c index ee678db089c..c64c75ccffd 100644 --- a/reactos/drivers/ksfilter/ks/connectivity.c +++ b/reactos/drivers/ksfilter/ks/connectivity.c @@ -1,14 +1,4 @@ -/* - KsCreatePin - KsValidateConnectRequest - KsPinPropertyHandler - KsPinDataIntersection - KsHandleSizedListQuery -*/ - -#include -#include -#include +#include "priv.h" KSDDKAPI NTSTATUS NTAPI KsCreatePin( diff --git a/reactos/drivers/ksfilter/ks/device.c b/reactos/drivers/ksfilter/ks/device.c index 05367926b8d..36ce5570b0c 100644 --- a/reactos/drivers/ksfilter/ks/device.c +++ b/reactos/drivers/ksfilter/ks/device.c @@ -1,32 +1,218 @@ -#include -#include -#include - -#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; diff --git a/reactos/drivers/ksfilter/ks/driver.c b/reactos/drivers/ksfilter/ks/driver.c index b02c4aa1398..facd00ea95e 100644 --- a/reactos/drivers/ksfilter/ks/driver.c +++ b/reactos/drivers/ksfilter/ks/driver.c @@ -1,10 +1,19 @@ -#include -#include -#include +#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 */ diff --git a/reactos/drivers/ksfilter/ks/events.c b/reactos/drivers/ksfilter/ks/events.c index ab0334f3b40..1558b216c68 100644 --- a/reactos/drivers/ksfilter/ks/events.c +++ b/reactos/drivers/ksfilter/ks/events.c @@ -1,6 +1,4 @@ -#include -#include -#include +#include "priv.h" /* =============================================================== Event Functions diff --git a/reactos/drivers/ksfilter/ks/irp.c b/reactos/drivers/ksfilter/ks/irp.c index ee2c312e1c3..9663d414816 100644 --- a/reactos/drivers/ksfilter/ks/irp.c +++ b/reactos/drivers/ksfilter/ks/irp.c @@ -3,11 +3,7 @@ IRP Helpers */ -#include -#include -#include - -#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 */ diff --git a/reactos/drivers/ksfilter/ks/kcom.c b/reactos/drivers/ksfilter/ks/kcom.c index 84e3532b6d4..3b2a7b63d5a 100644 --- a/reactos/drivers/ksfilter/ks/kcom.c +++ b/reactos/drivers/ksfilter/ks/kcom.c @@ -2,11 +2,9 @@ Kernel-mode COM */ -#include -#include -#include -#include +#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. diff --git a/reactos/drivers/ksfilter/ks/ksfunc.h b/reactos/drivers/ksfilter/ks/ksfunc.h index 6e93d5bdf4d..2110f64d45f 100644 --- a/reactos/drivers/ksfilter/ks/ksfunc.h +++ b/reactos/drivers/ksfilter/ks/ksfunc.h @@ -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') diff --git a/reactos/drivers/ksfilter/ks/ksiface.h b/reactos/drivers/ksfilter/ks/ksiface.h index 6e4f8249a4b..896652b554e 100644 --- a/reactos/drivers/ksfilter/ks/ksiface.h +++ b/reactos/drivers/ksfilter/ks/ksiface.h @@ -4,7 +4,15 @@ #include #include +#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_ diff --git a/reactos/drivers/ksfilter/ks/kstypes.h b/reactos/drivers/ksfilter/ks/kstypes.h new file mode 100644 index 00000000000..a8fa9c4dec4 --- /dev/null +++ b/reactos/drivers/ksfilter/ks/kstypes.h @@ -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 diff --git a/reactos/drivers/ksfilter/ks/methods.c b/reactos/drivers/ksfilter/ks/methods.c index 96bf4939dba..9084df3773d 100644 --- a/reactos/drivers/ksfilter/ks/methods.c +++ b/reactos/drivers/ksfilter/ks/methods.c @@ -1,11 +1,9 @@ +#include "priv.h" + /* =============================================================== Method Functions */ -#include -#include -#include - /* @unimplemented */ diff --git a/reactos/drivers/ksfilter/ks/priv.h b/reactos/drivers/ksfilter/ks/priv.h new file mode 100644 index 00000000000..4443fda5fcd --- /dev/null +++ b/reactos/drivers/ksfilter/ks/priv.h @@ -0,0 +1,19 @@ +#ifndef PRIV_H__ +#define PRIV_H__ + +#include +#include +#include +#include +#include + +#include "ksfunc.h" +#include "kstypes.h" +#include "ksiface.h" + + + + + + +#endif diff --git a/reactos/drivers/ksfilter/ks/properties.c b/reactos/drivers/ksfilter/ks/properties.c index 1b12e52962f..44ee640f536 100644 --- a/reactos/drivers/ksfilter/ks/properties.c +++ b/reactos/drivers/ksfilter/ks/properties.c @@ -1,6 +1,4 @@ -#include -#include -#include +#include "priv.h" /* =============================================================== Property Functions diff --git a/reactos/drivers/ksfilter/ks/worker.c b/reactos/drivers/ksfilter/ks/worker.c index 6fb1292560b..393d5125bfa 100644 --- a/reactos/drivers/ksfilter/ks/worker.c +++ b/reactos/drivers/ksfilter/ks/worker.c @@ -1,12 +1,9 @@ +#include "priv.h" + /* =============================================================== Worker Management Functions */ -#include -#include -#include - - typedef struct { KEVENT Event;