mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 21:53:06 +00:00
- Start implementing object bag support functions
- Implement KsCreateDevice, KsAddDevice, KsInitializeDriver - Add KsDefaultForwardIrp stub svn path=/trunk/; revision=39104
This commit is contained in:
parent
7685b6a1a8
commit
5284f4a283
10 changed files with 389 additions and 17 deletions
58
reactos/drivers/ksfilter/ks/bag.c
Normal file
58
reactos/drivers/ksfilter/ks/bag.c
Normal file
|
@ -0,0 +1,58 @@
|
||||||
|
#include <ntddk.h>
|
||||||
|
#include <debug.h>
|
||||||
|
#include <ks.h>
|
||||||
|
#if 0
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
LIST_ENTRY Entry;
|
||||||
|
PVOID Item;
|
||||||
|
PFNKSFREE Free;
|
||||||
|
LONG ReferenceCount;
|
||||||
|
}KSOBJECT_BAG_ENTRY;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
LIST_ENTRY ListHead;
|
||||||
|
KMUTEX Lock;
|
||||||
|
}KSOBJECT_BAG_IMPL;
|
||||||
|
|
||||||
|
/*
|
||||||
|
@implemented
|
||||||
|
*/
|
||||||
|
KSDDKAPI
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
KsAddItemToObjectBag(
|
||||||
|
IN KSOBJECT_BAG ObjectBag,
|
||||||
|
IN PVOID Item,
|
||||||
|
IN PFNKSFREE Free OPTIONAL)
|
||||||
|
{
|
||||||
|
KSOBJECT_BAG_ENTRY * Entry;
|
||||||
|
KSOBJECT_BAG_IMPL * Bag = (KSOBJECT_BAG_IMPL)ObjectBag;
|
||||||
|
|
||||||
|
Entry = ExAllocatePool(NonPagedPool, sizeof(KSOBJECT_BAG_ENTRY));
|
||||||
|
if (!Entry)
|
||||||
|
return STATUS_INSUFFICIENT_RESOURCES;
|
||||||
|
|
||||||
|
Entry->Free = Free;
|
||||||
|
Entry->Item = Item;
|
||||||
|
|
||||||
|
InsertTailList(&Bag->ListHead, &Entry->Entry);
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
KSDDKAPI
|
||||||
|
ULONG
|
||||||
|
NTAPI
|
||||||
|
KsRemoveItemFromObjectBag(
|
||||||
|
IN KSOBJECT_BAG ObjectBag,
|
||||||
|
IN PVOID Item,
|
||||||
|
IN BOOLEAN Free)
|
||||||
|
{
|
||||||
|
KSOBJECT_BAG_IMPL * Bag = (KSOBJECT_BAG_IMPL)ObjectBag;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
#endif
|
|
@ -6,6 +6,11 @@
|
||||||
#include <debug.h>
|
#include <debug.h>
|
||||||
#include <ks.h>
|
#include <ks.h>
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
|
||||||
|
}KS_DEFAULT_CLOCK;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@unimplemented
|
@unimplemented
|
||||||
*/
|
*/
|
||||||
|
@ -27,19 +32,28 @@ KsCreateDefaultClock(
|
||||||
IN PIRP Irp,
|
IN PIRP Irp,
|
||||||
IN PKSDEFAULTCLOCK DefaultClock)
|
IN PKSDEFAULTCLOCK DefaultClock)
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED;
|
NTSTATUS Status;
|
||||||
|
PKSCLOCK_CREATE ClockCreate;
|
||||||
|
|
||||||
|
Status = KsValidateClockCreateRequest(Irp, &ClockCreate);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
return Status;
|
||||||
|
|
||||||
|
// ExAllocatePoolWithTag(NonPagedPool, sizeof(KS_DEFAULT_CLOCK), 0);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
return STATUS_UNSUCCESSFUL;
|
return STATUS_UNSUCCESSFUL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@unimplemented
|
@implemented
|
||||||
*/
|
*/
|
||||||
KSDDKAPI NTSTATUS NTAPI
|
KSDDKAPI NTSTATUS NTAPI
|
||||||
KsAllocateDefaultClock(
|
KsAllocateDefaultClock(
|
||||||
OUT PKSDEFAULTCLOCK* DefaultClock)
|
OUT PKSDEFAULTCLOCK* DefaultClock)
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED;
|
return KsAllocateDefaultClockEx(DefaultClock, NULL, NULL, NULL, NULL, NULL, 0);
|
||||||
return STATUS_UNSUCCESSFUL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
34
reactos/drivers/ksfilter/ks/device.c
Normal file
34
reactos/drivers/ksfilter/ks/device.c
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
#include <ntddk.h>
|
||||||
|
#include <debug.h>
|
||||||
|
#include <ks.h>
|
||||||
|
|
||||||
|
#include "ksiface.h"
|
||||||
|
#include "ksfunc.h"
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
IKsDeviceVtbl *lpVtbl;
|
||||||
|
|
||||||
|
LONG ref;
|
||||||
|
|
||||||
|
|
||||||
|
}IKsDeviceImpl;
|
||||||
|
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
NewIKsDevice(IKsDevice** OutDevice)
|
||||||
|
{
|
||||||
|
IKsDeviceImpl * This;
|
||||||
|
|
||||||
|
This = ExAllocatePoolWithTag(NonPagedPool, sizeof(IKsDeviceImpl), 0x12345678); //FIX TAG
|
||||||
|
if (!This)
|
||||||
|
return STATUS_INSUFFICIENT_RESOURCES;
|
||||||
|
|
||||||
|
This->ref = 1;
|
||||||
|
//This->lpVtbl = &vt_IKsDevice;
|
||||||
|
|
||||||
|
*OutDevice = (IKsDevice*)This;
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
143
reactos/drivers/ksfilter/ks/driver.c
Normal file
143
reactos/drivers/ksfilter/ks/driver.c
Normal file
|
@ -0,0 +1,143 @@
|
||||||
|
#include <ntddk.h>
|
||||||
|
#include <debug.h>
|
||||||
|
#include <ks.h>
|
||||||
|
|
||||||
|
#include "ksfunc.h"
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
@unimplemented
|
||||||
|
*/
|
||||||
|
KSDDKAPI
|
||||||
|
PKSDEVICE
|
||||||
|
NTAPI
|
||||||
|
KsGetDeviceForDeviceObject(
|
||||||
|
IN PDEVICE_OBJECT FunctionalDeviceObject)
|
||||||
|
{
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
@unimplemented
|
||||||
|
*/
|
||||||
|
KSDDKAPI
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
KsInitializeDevice(
|
||||||
|
IN PDEVICE_OBJECT FunctionalDeviceObject,
|
||||||
|
IN PDEVICE_OBJECT PhysicalDeviceObject,
|
||||||
|
IN PDEVICE_OBJECT NextDeviceObject,
|
||||||
|
IN const KSDEVICE_DESCRIPTOR* Descriptor OPTIONAL)
|
||||||
|
{
|
||||||
|
return STATUS_UNSUCCESSFUL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
@implemented
|
||||||
|
*/
|
||||||
|
KSDDKAPI
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
KsCreateDevice(
|
||||||
|
IN PDRIVER_OBJECT DriverObject,
|
||||||
|
IN PDEVICE_OBJECT PhysicalDeviceObject,
|
||||||
|
IN const KSDEVICE_DESCRIPTOR* Descriptor OPTIONAL,
|
||||||
|
IN ULONG ExtensionSize OPTIONAL,
|
||||||
|
OUT PKSDEVICE* Device OPTIONAL)
|
||||||
|
{
|
||||||
|
NTSTATUS Status = STATUS_DEVICE_REMOVED;
|
||||||
|
PDEVICE_OBJECT FunctionalDeviceObject= NULL;
|
||||||
|
PDEVICE_OBJECT OldHighestDeviceObject;
|
||||||
|
|
||||||
|
if (!ExtensionSize)
|
||||||
|
ExtensionSize = sizeof(PVOID);
|
||||||
|
|
||||||
|
Status = IoCreateDevice(DriverObject, ExtensionSize, NULL, FILE_DEVICE_KS, FILE_DEVICE_SECURE_OPEN, FALSE, &FunctionalDeviceObject);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
return Status;
|
||||||
|
|
||||||
|
OldHighestDeviceObject = IoAttachDeviceToDeviceStack(FunctionalDeviceObject, PhysicalDeviceObject);
|
||||||
|
if (OldHighestDeviceObject)
|
||||||
|
{
|
||||||
|
Status = KsInitializeDevice(FunctionalDeviceObject, PhysicalDeviceObject, OldHighestDeviceObject, Descriptor);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
if (OldHighestDeviceObject)
|
||||||
|
IoDetachDevice(OldHighestDeviceObject);
|
||||||
|
|
||||||
|
IoDeleteDevice(FunctionalDeviceObject);
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Device)
|
||||||
|
{
|
||||||
|
*Device = KsGetDeviceForDeviceObject(FunctionalDeviceObject);
|
||||||
|
}
|
||||||
|
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
@implemented
|
||||||
|
*/
|
||||||
|
KSDDKAPI
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
KsAddDevice(
|
||||||
|
IN PDRIVER_OBJECT DriverObject,
|
||||||
|
IN PDEVICE_OBJECT PhysicalDeviceObject)
|
||||||
|
{
|
||||||
|
PKSDEVICE_DESCRIPTOR *DriverObjectExtension;
|
||||||
|
PKSDEVICE_DESCRIPTOR Descriptor = NULL;
|
||||||
|
|
||||||
|
DriverObjectExtension = IoGetDriverObjectExtension(DriverObject, (PVOID)KsAddDevice);
|
||||||
|
if (DriverObjectExtension)
|
||||||
|
{
|
||||||
|
Descriptor = *DriverObjectExtension;
|
||||||
|
}
|
||||||
|
|
||||||
|
return KsCreateDevice(DriverObject, PhysicalDeviceObject, Descriptor, 0, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
@implemented
|
||||||
|
*/
|
||||||
|
KSDDKAPI
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
KsInitializeDriver(
|
||||||
|
IN PDRIVER_OBJECT DriverObject,
|
||||||
|
IN PUNICODE_STRING RegistryPath,
|
||||||
|
IN const KSDEVICE_DESCRIPTOR *Descriptor OPTIONAL
|
||||||
|
)
|
||||||
|
{
|
||||||
|
PKSDEVICE_DESCRIPTOR *DriverObjectExtension;
|
||||||
|
NTSTATUS Status;
|
||||||
|
|
||||||
|
if (Descriptor)
|
||||||
|
{
|
||||||
|
Status = IoAllocateDriverObjectExtension(DriverObject, (PVOID)KsAddDevice, sizeof(PKSDEVICE_DESCRIPTOR), (PVOID*)&DriverObjectExtension);
|
||||||
|
if (NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
*DriverObjectExtension = (KSDEVICE_DESCRIPTOR*)Descriptor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* Setting our IRP handlers */
|
||||||
|
//DriverObject->MajorFunction[IRP_MJ_CREATE] = KspDispatch;
|
||||||
|
//DriverObject->MajorFunction[IRP_MJ_PNP] = KspDispatch;
|
||||||
|
//DriverObject->MajorFunction[IRP_MJ_POWER] = KspDispatch;
|
||||||
|
|
||||||
|
/* The driver-supplied AddDevice */
|
||||||
|
DriverObject->DriverExtension->AddDevice = KsAddDevice;
|
||||||
|
|
||||||
|
/* KS handles these */
|
||||||
|
DPRINT1("Setting KS function handlers\n");
|
||||||
|
KsSetMajorFunctionHandler(DriverObject, IRP_MJ_CLOSE);
|
||||||
|
KsSetMajorFunctionHandler(DriverObject, IRP_MJ_DEVICE_CONTROL);
|
||||||
|
|
||||||
|
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
|
@ -678,3 +678,16 @@ KsWriteFile(
|
||||||
UNIMPLEMENTED;
|
UNIMPLEMENTED;
|
||||||
return STATUS_UNSUCCESSFUL;
|
return STATUS_UNSUCCESSFUL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
@unimplemented
|
||||||
|
*/
|
||||||
|
KSDDKAPI NTSTATUS NTAPI
|
||||||
|
KsDefaultForwardIrp(
|
||||||
|
IN PDEVICE_OBJECT DeviceObject,
|
||||||
|
IN PIRP Irp)
|
||||||
|
{
|
||||||
|
UNIMPLEMENTED;
|
||||||
|
return STATUS_UNSUCCESSFUL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -12,6 +12,9 @@
|
||||||
<define name="_COMDDK_" />
|
<define name="_COMDDK_" />
|
||||||
<file>ks.rc</file>
|
<file>ks.rc</file>
|
||||||
<file>allocators.c</file>
|
<file>allocators.c</file>
|
||||||
|
<file>bag.c</file>
|
||||||
|
<file>device.c</file>
|
||||||
|
<file>driver.c</file>
|
||||||
<file>clocks.c</file>
|
<file>clocks.c</file>
|
||||||
<file>connectivity.c</file>
|
<file>connectivity.c</file>
|
||||||
<file>events.c</file>
|
<file>events.c</file>
|
||||||
|
|
|
@ -44,6 +44,7 @@
|
||||||
@ stdcall KsHandleSizedListQuery(ptr long long ptr)
|
@ stdcall KsHandleSizedListQuery(ptr long long ptr)
|
||||||
|
|
||||||
@ stdcall KsAcquireResetValue(ptr ptr)
|
@ stdcall KsAcquireResetValue(ptr ptr)
|
||||||
|
@ stdcall KsDefaultForwardIrp(ptr ptr)
|
||||||
@ stdcall KsAddIrpToCancelableQueue(ptr ptr ptr long ptr)
|
@ stdcall KsAddIrpToCancelableQueue(ptr ptr ptr long ptr)
|
||||||
@ stdcall KsAddObjectCreateItemToDeviceHeader(ptr ptr ptr wstr ptr)
|
@ stdcall KsAddObjectCreateItemToDeviceHeader(ptr ptr ptr wstr ptr)
|
||||||
@ stdcall KsAddObjectCreateItemToObjectHeader(ptr ptr ptr wstr ptr)
|
@ stdcall KsAddObjectCreateItemToObjectHeader(ptr ptr ptr wstr ptr)
|
||||||
|
|
17
reactos/drivers/ksfilter/ks/ksfunc.h
Normal file
17
reactos/drivers/ksfilter/ks/ksfunc.h
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
#ifndef KSFUNC_H__
|
||||||
|
#define KSFUNC_H__
|
||||||
|
|
||||||
|
#include "ksiface.h"
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
NewIKsDevice(IKsDevice** OutDevice);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
101
reactos/drivers/ksfilter/ks/ksiface.h
Normal file
101
reactos/drivers/ksfilter/ks/ksiface.h
Normal file
|
@ -0,0 +1,101 @@
|
||||||
|
#ifndef KSIFACE_H__
|
||||||
|
#define KSIFACE_H__
|
||||||
|
|
||||||
|
#include <ntddk.h>
|
||||||
|
#include <ks.h>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*****************************************************************************
|
||||||
|
* IKsFilterFactory
|
||||||
|
*****************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
#undef INTERFACE
|
||||||
|
#define INTERFACE IKsFilterFactory
|
||||||
|
|
||||||
|
struct KSFILTERFACTORY;
|
||||||
|
|
||||||
|
DECLARE_INTERFACE_(IKsFilterFactory, IUnknown)
|
||||||
|
{
|
||||||
|
//DEFINE_ABSTRACT_UNKNOWN()
|
||||||
|
|
||||||
|
STDMETHOD_(struct KSFILTERFACTORY*,GetStruct)(THIS) PURE;
|
||||||
|
|
||||||
|
STDMETHOD_(NTSTATUS,SetDeviceClassesState)(THIS_
|
||||||
|
IN ULONG Unknown1,
|
||||||
|
IN BOOLEAN Enable)PURE;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/*****************************************************************************
|
||||||
|
* IKsPowerNotify
|
||||||
|
*****************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
#undef INTERFACE
|
||||||
|
#define INTERFACE IKsPowerNotify
|
||||||
|
|
||||||
|
DECLARE_INTERFACE_(IKsPowerNotify, IUnknown)
|
||||||
|
{
|
||||||
|
//DEFINE_ABSTRACT_UNKNOWN()
|
||||||
|
|
||||||
|
STDMETHOD_(ULONG,Sleep)(THIS_
|
||||||
|
IN DEVICE_POWER_STATE State) PURE;
|
||||||
|
|
||||||
|
STDMETHOD_(ULONG,Wake)(THIS) PURE;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/*****************************************************************************
|
||||||
|
* IKsDevice
|
||||||
|
*****************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
#undef INTERFACE
|
||||||
|
#define INTERFACE IKsDevice
|
||||||
|
|
||||||
|
struct KSIOBJECTBAG;
|
||||||
|
struct KSPOWER_ENTRY;
|
||||||
|
|
||||||
|
DECLARE_INTERFACE_(IKsDevice, IUnknown)
|
||||||
|
{
|
||||||
|
//DEFINE_ABSTRACT_UNKNOWN()
|
||||||
|
|
||||||
|
STDMETHOD_(struct 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_(VOID, GetAdapterObject)(THIS_
|
||||||
|
IN PADAPTER_OBJECT Object,
|
||||||
|
IN PULONG Unknown1,
|
||||||
|
IN PULONG Unknown2) PURE;
|
||||||
|
|
||||||
|
STDMETHOD_(VOID, AddPowerEntry)(THIS_
|
||||||
|
IN struct KSPOWER_ENTRY * Entry,
|
||||||
|
IN struct IKsPowerNotify* Notify)PURE;
|
||||||
|
|
||||||
|
STDMETHOD_(VOID, RemovePowerEntry)(THIS_
|
||||||
|
IN struct KSPOWER_ENTRY * Entry)PURE;
|
||||||
|
|
||||||
|
STDMETHOD_(NTSTATUS, PinStateChange)(THIS_
|
||||||
|
IN KSPIN Pin,
|
||||||
|
IN PIRP Irp,
|
||||||
|
IN KSSTATE OldState,
|
||||||
|
IN KSSTATE NewState)PURE;
|
||||||
|
|
||||||
|
STDMETHOD_(NTSTATUS, ArbitrateAdapterChannel)(THIS_
|
||||||
|
IN ULONG ControlCode,
|
||||||
|
IN IO_ALLOCATION_ACTION Action,
|
||||||
|
IN PVOID Context)PURE;
|
||||||
|
|
||||||
|
STDMETHOD_(NTSTATUS, CheckIoCapability)(THIS_
|
||||||
|
IN ULONG Unknown)PURE;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
|
@ -218,17 +218,5 @@ KsSynchronousIoControlDevice(
|
||||||
return STATUS_UNSUCCESSFUL;
|
return STATUS_UNSUCCESSFUL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
@unimplemented
|
|
||||||
*/
|
|
||||||
KSDDKAPI NTSTATUS NTAPI
|
|
||||||
KsInitializeDriver(
|
|
||||||
IN PDRIVER_OBJECT DriverObject,
|
|
||||||
IN PUNICODE_STRING RegistryPath,
|
|
||||||
IN const KSDEVICE_DESCRIPTOR *Descriptor OPTIONAL
|
|
||||||
)
|
|
||||||
{
|
|
||||||
UNIMPLEMENTED;
|
|
||||||
return STATUS_UNSUCCESSFUL;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue