- 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:
Johannes Anderwald 2009-02-10 07:44:43 +00:00
parent 77f7338705
commit 919e4f45d7
16 changed files with 308 additions and 98 deletions

View file

@ -1,10 +1,5 @@
/* ===============================================================
Allocator Functions
*/
#include "priv.h"
#include <ntddk.h>
#include <debug.h>
#include <ks.h>
/*
@unimplemented

View file

@ -1,6 +1,6 @@
#include <ntddk.h>
#include <debug.h>
#include <ks.h>
#include "priv.h"
#if 0
typedef struct
{

View file

@ -1,10 +1,4 @@
/* ===============================================================
Clock Functions
*/
#include <ntddk.h>
#include <debug.h>
#include <ks.h>
#include "priv.h"
typedef struct
{

View file

@ -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(

View file

@ -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;

View file

@ -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
*/

View file

@ -1,6 +1,4 @@
#include <ntddk.h>
#include <debug.h>
#include <ks.h>
#include "priv.h"
/* ===============================================================
Event Functions

View file

@ -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 */

View file

@ -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.

View file

@ -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')

View file

@ -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_

View 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

View file

@ -1,11 +1,9 @@
#include "priv.h"
/* ===============================================================
Method Functions
*/
#include <ntddk.h>
#include <debug.h>
#include <ks.h>
/*
@unimplemented
*/

View 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

View file

@ -1,6 +1,4 @@
#include <ntddk.h>
#include <debug.h>
#include <ks.h>
#include "priv.h"
/* ===============================================================
Property Functions

View file

@ -1,12 +1,9 @@
#include "priv.h"
/* ===============================================================
Worker Management Functions
*/
#include <ntddk.h>
#include <debug.h>
#include <ks.h>
typedef struct
{
KEVENT Event;