mirror of
https://github.com/reactos/reactos.git
synced 2025-08-03 22:56:00 +00:00
[KS]
- Store Object Header in FsContext2 - Fix allocation of create item entry in KsAllocateObjectCreateItem - Fix de-referencing in Ks[De]ReferenceSoftwareBusObject & Ks[De]ReferenceBusObject - Fake success in KsEnableEvent - Check if the list empty in KspFreeEventList - Handle GUID_NULL in KspPropertyHandler - Return STATUS_MORE_ENTRIES if outputbuffer is too small - Zero struct in KsRegisterWorker [PORTCLS] - Store dispatch context in FsContext - Ignore return value in interrupt sync routine [[Amine Khaldi]] - Disable assert for frame size check for now - Free buffer only if the irp was from kernel mode(hack 2 be removed) - remove unused includes [[Amine Khaldi]] - Don't attempt copying an empty resource list [[Amine Khaldi]] [WDMAUD_KERNEL] - Check if allocation succeeded [[Amine Khaldi]] [SYSAUDIO] - Store dispatch context in FsContext2 svn path=/trunk/; revision=43035
This commit is contained in:
parent
d34f9b2919
commit
6fd2ea71d2
24 changed files with 156 additions and 97 deletions
|
@ -445,7 +445,7 @@ IKsAllocator_DispatchRequest(
|
|||
ASSERT(FileObject);
|
||||
|
||||
/* get object header */
|
||||
Header = (PKSIOBJECT_HEADER)FileObject->FsContext;
|
||||
Header = (PKSIOBJECT_HEADER)FileObject->FsContext2;
|
||||
|
||||
/* get real allocator */
|
||||
Status = Header->Unknown->lpVtbl->QueryInterface(Header->Unknown, &IID_IKsAllocator, (PVOID*)&Allocator);
|
||||
|
|
|
@ -494,8 +494,8 @@ KspFreeCreateItems(
|
|||
Entry = (PCREATE_ITEM_ENTRY)CONTAINING_RECORD(RemoveHeadList(ListHead), CREATE_ITEM_ENTRY, Entry);
|
||||
|
||||
/* caller shouldnt have any references */
|
||||
ASSERT(Entry->ReferenceCount == 0);
|
||||
ASSERT(IsListEmpty(&Entry->ObjectItemList));
|
||||
//ASSERT(Entry->ReferenceCount == 0);
|
||||
//ASSERT(IsListEmpty(&Entry->ObjectItemList));
|
||||
|
||||
/* does the creator wish notification */
|
||||
if (Entry->ItemFreeCallback)
|
||||
|
@ -687,8 +687,7 @@ KsAllocateObjectHeader(
|
|||
}
|
||||
}
|
||||
/* store the object in the file object */
|
||||
ASSERT(IoStack->FileObject->FsContext == NULL);
|
||||
IoStack->FileObject->FsContext = ObjectHeader;
|
||||
IoStack->FileObject->FsContext2 = ObjectHeader;
|
||||
|
||||
/* store parent device */
|
||||
ObjectHeader->ParentDeviceObject = IoGetRelatedDeviceObject(IoStack->FileObject);
|
||||
|
@ -720,6 +719,8 @@ KsFreeObjectHeader(
|
|||
{
|
||||
PKSIOBJECT_HEADER ObjectHeader = (PKSIOBJECT_HEADER) Header;
|
||||
|
||||
DPRINT1("KsFreeObjectHeader Header %p Class %wZ\n", Header, &ObjectHeader->ObjectClass);
|
||||
|
||||
if (ObjectHeader->ObjectClass.Buffer)
|
||||
{
|
||||
/* release object class buffer */
|
||||
|
@ -825,7 +826,7 @@ KsAddObjectCreateItemToDeviceHeader(
|
|||
/* increment create item count */
|
||||
InterlockedIncrement(&Header->ItemListCount);
|
||||
}
|
||||
|
||||
DPRINT("KsAddObjectCreateItemToDeviceHeader Status %x\n", Status);
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
@ -898,7 +899,7 @@ KsAllocateObjectCreateItem(
|
|||
return STATUS_INVALID_PARAMETER_2;
|
||||
|
||||
/* first allocate a create entry */
|
||||
CreateEntry = AllocateItem(NonPagedPool, sizeof(PCREATE_ITEM_ENTRY));
|
||||
CreateEntry = AllocateItem(NonPagedPool, sizeof(CREATE_ITEM_ENTRY));
|
||||
|
||||
/* check for allocation success */
|
||||
if (!CreateEntry)
|
||||
|
@ -1121,7 +1122,7 @@ KsSynchronousIoControlDevice(
|
|||
|
||||
|
||||
/* get object header */
|
||||
ObjectHeader = (PKSIOBJECT_HEADER)FileObject->FsContext;
|
||||
ObjectHeader = (PKSIOBJECT_HEADER)FileObject->FsContext2;
|
||||
|
||||
/* check if there is fast device io function */
|
||||
if (ObjectHeader && ObjectHeader->DispatchTable.FastDeviceIoControl)
|
||||
|
@ -1129,7 +1130,7 @@ KsSynchronousIoControlDevice(
|
|||
IoStatusBlock.Status = STATUS_UNSUCCESSFUL;
|
||||
IoStatusBlock.Information = 0;
|
||||
|
||||
/* it is send the request */
|
||||
/* send the request */
|
||||
Status = ObjectHeader->DispatchTable.FastDeviceIoControl(FileObject, TRUE, InBuffer, InSize, OutBuffer, OutSize, IoControl, &IoStatusBlock, DeviceObject);
|
||||
/* check if the request was handled */
|
||||
//DPRINT("Handled %u Status %x Length %u\n", Status, IoStatusBlock.Status, IoStatusBlock.Information);
|
||||
|
|
|
@ -200,6 +200,8 @@ KsPinPropertyHandler(
|
|||
IoStack = IoGetCurrentIrpStackLocation(Irp);
|
||||
Buffer = Irp->UserBuffer;
|
||||
|
||||
DPRINT("KsPinPropertyHandler Irp %p Property %p Data %p DescriptorsCount %u Descriptor %p OutputLength %u Id %x\n", Irp, Property, Data, DescriptorsCount, Descriptor, IoStack->Parameters.DeviceIoControl.OutputBufferLength, Property->Id);
|
||||
|
||||
switch(Property->Id)
|
||||
{
|
||||
case KSPROPERTY_PIN_CTYPES:
|
||||
|
|
|
@ -570,7 +570,7 @@ IKsDevice_Create(
|
|||
if (IoStack->FileObject->RelatedFileObject != NULL)
|
||||
{
|
||||
/* request is to instantiate a pin / node / clock / allocator */
|
||||
ObjectHeader = (PKSIOBJECT_HEADER)IoStack->FileObject->RelatedFileObject->FsContext;
|
||||
ObjectHeader = (PKSIOBJECT_HEADER)IoStack->FileObject->RelatedFileObject->FsContext2;
|
||||
|
||||
/* sanity check */
|
||||
ASSERT(ObjectHeader);
|
||||
|
@ -717,7 +717,7 @@ KsReferenceSoftwareBusObject(
|
|||
PKSIDEVICE_HEADER DeviceHeader = (PKSIDEVICE_HEADER)Header;
|
||||
|
||||
/* get device interface */
|
||||
Device = (IKsDevice*)&DeviceHeader->lpVtblIKsDevice;
|
||||
Device = (IKsDevice*)DeviceHeader->lpVtblIKsDevice;
|
||||
|
||||
if (Device)
|
||||
{
|
||||
|
@ -741,7 +741,7 @@ KsReferenceBusObject(
|
|||
PKSIDEVICE_HEADER DeviceHeader = (PKSIDEVICE_HEADER)Header;
|
||||
|
||||
/* get device interface */
|
||||
Device = (IKsDevice*)&DeviceHeader->lpVtblIKsDevice;
|
||||
Device = (IKsDevice*)DeviceHeader->lpVtblIKsDevice;
|
||||
|
||||
if (Device)
|
||||
{
|
||||
|
@ -766,7 +766,7 @@ KsDereferenceBusObject(
|
|||
PKSIDEVICE_HEADER DeviceHeader = (PKSIDEVICE_HEADER)Header;
|
||||
|
||||
/* get device interface */
|
||||
Device = (IKsDevice*)&DeviceHeader->lpVtblIKsDevice;
|
||||
Device = (IKsDevice*)DeviceHeader->lpVtblIKsDevice;
|
||||
|
||||
if (Device)
|
||||
{
|
||||
|
@ -783,11 +783,14 @@ VOID
|
|||
NTAPI
|
||||
KsDereferenceSoftwareBusObject(
|
||||
IN KSDEVICE_HEADER Header)
|
||||
{ IKsDevice * Device;
|
||||
{
|
||||
IKsDevice * Device;
|
||||
PKSIDEVICE_HEADER DeviceHeader = (PKSIDEVICE_HEADER)Header;
|
||||
|
||||
DPRINT1("KsDereferenceSoftwareBusObject DeviceHeader %p\n", Header);
|
||||
|
||||
/* get device interface */
|
||||
Device = (IKsDevice*)&DeviceHeader->lpVtblIKsDevice;
|
||||
Device = (IKsDevice*)DeviceHeader->lpVtblIKsDevice;
|
||||
|
||||
if (Device)
|
||||
{
|
||||
|
|
|
@ -87,7 +87,7 @@ KsEnableEvent(
|
|||
IN PVOID EventsLock OPTIONAL)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
return STATUS_UNSUCCESSFUL;
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -218,7 +218,7 @@ NTAPI
|
|||
KsDiscardEvent(
|
||||
IN PKSEVENT_ENTRY EventEntry)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
//UNIMPLEMENTED;
|
||||
}
|
||||
|
||||
|
||||
|
@ -234,6 +234,9 @@ KspFreeEventList(
|
|||
if (!Ctx || !Ctx->List)
|
||||
return FALSE;
|
||||
|
||||
if (IsListEmpty(Ctx->List))
|
||||
return FALSE;
|
||||
|
||||
/* remove first entry */
|
||||
Entry = RemoveHeadList(Ctx->List);
|
||||
if (!Entry)
|
||||
|
@ -358,7 +361,7 @@ KsDefaultAddEventHandler(
|
|||
IoStack = IoGetCurrentIrpStackLocation(Irp);
|
||||
|
||||
/* now get the object header */
|
||||
ObjectHeader =(PKSIOBJECT_HEADER)IoStack->FileObject->FsContext;
|
||||
ObjectHeader =(PKSIOBJECT_HEADER)IoStack->FileObject->FsContext2;
|
||||
|
||||
/* sanity check */
|
||||
ASSERT(ObjectHeader->ObjectType);
|
||||
|
|
|
@ -444,7 +444,7 @@ IKsFilter_GetFilterFromIrp(
|
|||
/* santiy check */
|
||||
ASSERT(IoStack->FileObject != NULL);
|
||||
|
||||
ObjectHeader = (PKSIOBJECT_HEADER)IoStack->FileObject->FsContext;
|
||||
ObjectHeader = (PKSIOBJECT_HEADER)IoStack->FileObject->FsContext2;
|
||||
|
||||
/* sanity is important */
|
||||
ASSERT(ObjectHeader != NULL);
|
||||
|
@ -1529,7 +1529,7 @@ KsGetFilterFromIrp(
|
|||
ASSERT(IoStack->FileObject);
|
||||
|
||||
/* get object header */
|
||||
ObjectHeader = (PKSIOBJECT_HEADER)IoStack->FileObject->FsContext;
|
||||
ObjectHeader = (PKSIOBJECT_HEADER)IoStack->FileObject->FsContext2;
|
||||
|
||||
if (ObjectHeader->Type == KsObjectTypeFilter)
|
||||
{
|
||||
|
|
|
@ -555,7 +555,7 @@ KsStreamIo(
|
|||
if (RequestorMode || ExGetPreviousMode() == KernelMode)
|
||||
{
|
||||
/* requestor is from kernel land */
|
||||
ObjectHeader = (PKSIOBJECT_HEADER)FileObject->FsContext;
|
||||
ObjectHeader = (PKSIOBJECT_HEADER)FileObject->FsContext2;
|
||||
|
||||
if (ObjectHeader)
|
||||
{
|
||||
|
@ -1348,6 +1348,8 @@ KsRemoveIrpFromCancelableQueue(
|
|||
PLIST_ENTRY CurEntry;
|
||||
KIRQL OldIrql;
|
||||
|
||||
DPRINT("KsRemoveIrpFromCancelableQueue ListHead %p SpinLock %p ListLocation %x RemovalOperation %x\n", QueueHead, SpinLock, ListLocation, RemovalOperation);
|
||||
|
||||
/* check parameters */
|
||||
if (!QueueHead || !SpinLock)
|
||||
return NULL;
|
||||
|
@ -1572,6 +1574,8 @@ KsRemoveSpecificIrpFromCancelableQueue(
|
|||
PKSPIN_LOCK SpinLock;
|
||||
KIRQL OldLevel;
|
||||
|
||||
DPRINT("KsRemoveSpecificIrpFromCancelableQueue %p\n", Irp);
|
||||
|
||||
/* get internal queue lock */
|
||||
SpinLock = KSQUEUE_SPINLOCK_IRP_STORAGE(Irp);
|
||||
|
||||
|
@ -1603,6 +1607,7 @@ KsAddIrpToCancelableQueue(
|
|||
PIO_STACK_LOCATION IoStack;
|
||||
KIRQL OldLevel;
|
||||
|
||||
DPRINT1("KsAddIrpToCancelableQueue QueueHead %p SpinLock %p Irp %p ListLocation %x DriverCancel %p\n", QueueHead, SpinLock, Irp, ListLocation, DriverCancel);
|
||||
/* check for required parameters */
|
||||
if (!QueueHead || !SpinLock || !Irp)
|
||||
return;
|
||||
|
@ -1796,7 +1801,7 @@ KspCreate(
|
|||
if (IoStack->FileObject->RelatedFileObject != NULL)
|
||||
{
|
||||
/* request is to instantiate a pin / node / clock / allocator */
|
||||
ObjectHeader = (PKSIOBJECT_HEADER)IoStack->FileObject->RelatedFileObject->FsContext;
|
||||
ObjectHeader = (PKSIOBJECT_HEADER)IoStack->FileObject->RelatedFileObject->FsContext2;
|
||||
|
||||
/* sanity check */
|
||||
ASSERT(ObjectHeader);
|
||||
|
@ -1858,7 +1863,7 @@ KspDispatchIrp(
|
|||
ASSERT(IoStack->FileObject);
|
||||
|
||||
/* get object header */
|
||||
ObjectHeader = (PKSIOBJECT_HEADER) IoStack->FileObject->FsContext;
|
||||
ObjectHeader = (PKSIOBJECT_HEADER) IoStack->FileObject->FsContext2;
|
||||
|
||||
if (!ObjectHeader)
|
||||
{
|
||||
|
@ -1931,12 +1936,19 @@ KsSetMajorFunctionHandler(
|
|||
IN PDRIVER_OBJECT DriverObject,
|
||||
IN ULONG MajorFunction)
|
||||
{
|
||||
DPRINT("KsSetMajorFunctionHandler Function %x\n", MajorFunction);
|
||||
#if 0
|
||||
// HACK
|
||||
// for MS PORTCLS
|
||||
//
|
||||
DriverObject->MajorFunction[IRP_MJ_CREATE] = KspCreate;
|
||||
#endif
|
||||
|
||||
switch ( MajorFunction )
|
||||
{
|
||||
case IRP_MJ_CREATE:
|
||||
DriverObject->MajorFunction[MajorFunction] = KspCreate;
|
||||
break;
|
||||
break;
|
||||
case IRP_MJ_DEVICE_CONTROL:
|
||||
case IRP_MJ_CLOSE:
|
||||
case IRP_MJ_READ:
|
||||
|
@ -1947,6 +1959,7 @@ KsSetMajorFunctionHandler(
|
|||
DriverObject->MajorFunction[MajorFunction] = KspDispatchIrp;
|
||||
break;
|
||||
default:
|
||||
DPRINT1("NotSupported %x\n", MajorFunction);
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
};
|
||||
|
||||
|
@ -1967,6 +1980,8 @@ KsDispatchIrp(
|
|||
PKSIDEVICE_HEADER DeviceHeader;
|
||||
PDEVICE_EXTENSION DeviceExtension;
|
||||
|
||||
DPRINT("KsDispatchIrp DeviceObject %p Irp %p\n", DeviceObject, Irp);
|
||||
|
||||
/* get device extension */
|
||||
DeviceExtension = (PDEVICE_EXTENSION)DeviceObject->DeviceExtension;
|
||||
/* get device header */
|
||||
|
|
|
@ -151,7 +151,7 @@ KsGetObjectFromFileObject(
|
|||
PKSIOBJECT_HEADER ObjectHeader;
|
||||
|
||||
/* get object header */
|
||||
ObjectHeader = (PKSIOBJECT_HEADER)FileObject->FsContext;
|
||||
ObjectHeader = (PKSIOBJECT_HEADER)FileObject->FsContext2;
|
||||
|
||||
/* return associated object */
|
||||
return ObjectHeader->ObjectType;
|
||||
|
@ -169,7 +169,7 @@ KsGetObjectTypeFromFileObject(
|
|||
PKSIOBJECT_HEADER ObjectHeader;
|
||||
|
||||
/* get object header */
|
||||
ObjectHeader = (PKSIOBJECT_HEADER)FileObject->FsContext;
|
||||
ObjectHeader = (PKSIOBJECT_HEADER)FileObject->FsContext2;
|
||||
/* return type */
|
||||
return ObjectHeader->Type;
|
||||
}
|
||||
|
@ -188,7 +188,7 @@ KsGetObjectTypeFromIrp(
|
|||
/* get current irp stack */
|
||||
IoStack = IoGetCurrentIrpStackLocation(Irp);
|
||||
/* get object header */
|
||||
ObjectHeader = (PKSIOBJECT_HEADER)IoStack->FileObject->FsContext;
|
||||
ObjectHeader = (PKSIOBJECT_HEADER)IoStack->FileObject->FsContext2;
|
||||
/* return type */
|
||||
return ObjectHeader->Type;
|
||||
}
|
||||
|
|
|
@ -548,7 +548,7 @@ KsGetPinFromIrp(
|
|||
PIO_STACK_LOCATION IoStack = IoGetCurrentIrpStackLocation(Irp);
|
||||
|
||||
/* get object header */
|
||||
ObjectHeader = (PKSIOBJECT_HEADER)IoStack->FileObject->FsContext;
|
||||
ObjectHeader = (PKSIOBJECT_HEADER)IoStack->FileObject->FsContext2;
|
||||
/* return object type */
|
||||
return (PKSPIN)ObjectHeader->ObjectType;
|
||||
|
||||
|
@ -904,10 +904,10 @@ IKsPin_DispatchDeviceIoControl(
|
|||
|
||||
/* sanity check */
|
||||
ASSERT(IoStack->FileObject);
|
||||
ASSERT(IoStack->FileObject->FsContext);
|
||||
ASSERT(IoStack->FileObject->FsContext2);
|
||||
|
||||
/* get the object header */
|
||||
ObjectHeader = (PKSIOBJECT_HEADER)IoStack->FileObject->FsContext;
|
||||
ObjectHeader = (PKSIOBJECT_HEADER)IoStack->FileObject->FsContext2;
|
||||
|
||||
/* locate ks pin implemention fro KSPIN offset */
|
||||
This = (IKsPinImpl*)CONTAINING_RECORD(ObjectHeader->ObjectType, IKsPinImpl, Pin);
|
||||
|
@ -961,10 +961,10 @@ IKsPin_Close(
|
|||
|
||||
/* sanity check */
|
||||
ASSERT(IoStack->FileObject);
|
||||
ASSERT(IoStack->FileObject->FsContext);
|
||||
ASSERT(IoStack->FileObject->FsContext2);
|
||||
|
||||
/* get the object header */
|
||||
ObjectHeader = (PKSIOBJECT_HEADER)IoStack->FileObject->FsContext;
|
||||
ObjectHeader = (PKSIOBJECT_HEADER)IoStack->FileObject->FsContext2;
|
||||
|
||||
/* locate ks pin implemention fro KSPIN offset */
|
||||
This = (IKsPinImpl*)CONTAINING_RECORD(ObjectHeader->ObjectType, IKsPinImpl, Pin);
|
||||
|
|
|
@ -25,6 +25,8 @@ FindPropertyHandler(
|
|||
|
||||
for(Index = 0; Index < PropertySetCount; Index++)
|
||||
{
|
||||
ASSERT(PropertySet[Index].Set);
|
||||
|
||||
if (IsEqualGUIDAligned(&Property->Set, PropertySet[Index].Set))
|
||||
{
|
||||
for(ItemIndex = 0; ItemIndex < PropertySet[Index].PropertiesCount; ItemIndex++)
|
||||
|
@ -42,7 +44,7 @@ FindPropertyHandler(
|
|||
{
|
||||
/* too small output buffer */
|
||||
IoStatus->Information = PropertySet[Index].PropertyItem[ItemIndex].MinData;
|
||||
return STATUS_BUFFER_TOO_SMALL;
|
||||
return STATUS_MORE_ENTRIES;
|
||||
}
|
||||
#if 0
|
||||
if (Property->Flags & KSPROPERTY_TYPE_BASICSUPPORT)
|
||||
|
@ -112,6 +114,8 @@ KspPropertyHandler(
|
|||
PIO_STACK_LOCATION IoStack;
|
||||
NTSTATUS Status;
|
||||
PFNKSHANDLER PropertyHandler = NULL;
|
||||
ULONG Index;
|
||||
LPGUID Guid;
|
||||
|
||||
/* get current irp stack */
|
||||
IoStack = IoGetCurrentIrpStackLocation(Irp);
|
||||
|
@ -126,17 +130,13 @@ KspPropertyHandler(
|
|||
|
||||
/* FIXME probe the input / output buffer if from user mode */
|
||||
|
||||
|
||||
/* get input property request */
|
||||
Property = (PKSPROPERTY)IoStack->Parameters.DeviceIoControl.Type3InputBuffer;
|
||||
|
||||
DPRINT("KspPropertyHandler Irp %p PropertySetsCount %u PropertySet %p Allocator %p PropertyItemSize %u ExpectedPropertyItemSize %u\n", Irp, PropertySetsCount, PropertySet, Allocator, PropertyItemSize, sizeof(KSPROPERTY_ITEM));
|
||||
|
||||
/* sanity check */
|
||||
ASSERT(PropertyItemSize == 0 || PropertyItemSize == sizeof(KSPROPERTY_ITEM));
|
||||
if (IsEqualGUIDAligned(&Property->Set, &KSPROPSETID_Topology))
|
||||
{
|
||||
/* use KsTopologyPropertyHandler for this business */
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
/* find the property handler */
|
||||
Status = FindPropertyHandler(&Irp->IoStatus, PropertySet, PropertySetsCount, Property, IoStack->Parameters.DeviceIoControl.InputBufferLength, IoStack->Parameters.DeviceIoControl.OutputBufferLength, Irp->UserBuffer, &PropertyHandler);
|
||||
|
@ -166,6 +166,26 @@ KspPropertyHandler(
|
|||
}
|
||||
}
|
||||
}
|
||||
else if (IsEqualGUIDAligned(&Property->Set, &GUID_NULL) && Property->Id == 0 && Property->Flags == KSPROPERTY_TYPE_SETSUPPORT)
|
||||
{
|
||||
// store output size
|
||||
Irp->IoStatus.Information = sizeof(GUID) * PropertySetsCount;
|
||||
if (IoStack->Parameters.DeviceIoControl.OutputBufferLength < sizeof(GUID) * PropertySetsCount)
|
||||
{
|
||||
// buffer too small
|
||||
return STATUS_BUFFER_OVERFLOW;
|
||||
}
|
||||
|
||||
// get output buffer
|
||||
Guid = (LPGUID)Irp->UserBuffer;
|
||||
|
||||
// copy property guids from property sets
|
||||
for(Index = 0; Index < PropertySetsCount; Index++)
|
||||
{
|
||||
RtlMoveMemory(&Guid[Index], PropertySet[Index].Set, sizeof(GUID));
|
||||
}
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/* done */
|
||||
return Status;
|
||||
|
|
|
@ -160,6 +160,8 @@ KsTopologyPropertyHandler(
|
|||
HANDLE hKey;
|
||||
PKEY_VALUE_PARTIAL_INFORMATION KeyInfo;
|
||||
|
||||
DPRINT("KsTopologyPropertyHandler Irp %p Property %p Data %p Topology %p\n", Irp, Property, Data, Topology);
|
||||
|
||||
if (Property->Flags != KSPROPERTY_TYPE_GET)
|
||||
{
|
||||
Irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED;
|
||||
|
|
|
@ -46,6 +46,9 @@ WorkItemRoutine(
|
|||
|
||||
do
|
||||
{
|
||||
/* sanity check */
|
||||
ASSERT(!IsListEmpty(&KsWorker->QueuedWorkItems));
|
||||
|
||||
/* remove first entry */
|
||||
Entry = RemoveHeadList(&KsWorker->QueuedWorkItems);
|
||||
/* get offset to work item */
|
||||
|
@ -95,7 +98,7 @@ KsRegisterWorker(
|
|||
}
|
||||
|
||||
/* allocate worker context */
|
||||
KsWorker = ExAllocatePool(NonPagedPool, sizeof(KSIWORKER));
|
||||
KsWorker = AllocateItem(NonPagedPool, sizeof(KSIWORKER));
|
||||
if (!KsWorker)
|
||||
return STATUS_INSUFFICIENT_RESOURCES;
|
||||
|
||||
|
@ -103,8 +106,6 @@ KsRegisterWorker(
|
|||
ExInitializeWorkItem(&KsWorker->WorkItem, WorkItemRoutine, (PVOID)KsWorker);
|
||||
/* setup type */
|
||||
KsWorker->Type = WorkQueueType;
|
||||
/* set counter to zero */
|
||||
KsWorker->Counter = 0;
|
||||
/* Initialize work item queue */
|
||||
InitializeListHead(&KsWorker->QueuedWorkItems);
|
||||
/* initialize work item lock */
|
||||
|
|
|
@ -22,7 +22,7 @@ Dispatch_fnDeviceIoControl(
|
|||
IoStack = IoGetCurrentIrpStackLocation(Irp);
|
||||
|
||||
// access IrpTarget
|
||||
IrpTarget = (IIrpTarget *)IoStack->FileObject->FsContext2;
|
||||
IrpTarget = (IIrpTarget *)IoStack->FileObject->FsContext;
|
||||
|
||||
// let IrpTarget handle request
|
||||
return IrpTarget->DeviceIoControl(DeviceObject, Irp);
|
||||
|
@ -41,7 +41,7 @@ Dispatch_fnRead(
|
|||
IoStack = IoGetCurrentIrpStackLocation(Irp);
|
||||
|
||||
// access IrpTarget
|
||||
IrpTarget = (IIrpTarget *)IoStack->FileObject->FsContext2;
|
||||
IrpTarget = (IIrpTarget *)IoStack->FileObject->FsContext;
|
||||
|
||||
|
||||
// let IrpTarget handle request
|
||||
|
@ -61,7 +61,7 @@ Dispatch_fnWrite(
|
|||
IoStack = IoGetCurrentIrpStackLocation(Irp);
|
||||
|
||||
// access IrpTarget
|
||||
IrpTarget = (IIrpTarget *)IoStack->FileObject->FsContext2;
|
||||
IrpTarget = (IIrpTarget *)IoStack->FileObject->FsContext;
|
||||
|
||||
|
||||
// let IrpTarget handle request
|
||||
|
@ -81,7 +81,7 @@ Dispatch_fnFlush(
|
|||
IoStack = IoGetCurrentIrpStackLocation(Irp);
|
||||
|
||||
// access IrpTarget
|
||||
IrpTarget = (IIrpTarget *)IoStack->FileObject->FsContext2;
|
||||
IrpTarget = (IIrpTarget *)IoStack->FileObject->FsContext;
|
||||
|
||||
|
||||
// let IrpTarget handle request
|
||||
|
@ -101,7 +101,7 @@ Dispatch_fnClose(
|
|||
IoStack = IoGetCurrentIrpStackLocation(Irp);
|
||||
|
||||
// access IrpTarget
|
||||
IrpTarget = (IIrpTarget *)IoStack->FileObject->FsContext2;
|
||||
IrpTarget = (IIrpTarget *)IoStack->FileObject->FsContext;
|
||||
|
||||
|
||||
// let IrpTarget handle request
|
||||
|
@ -121,7 +121,7 @@ Dispatch_fnQuerySecurity(
|
|||
IoStack = IoGetCurrentIrpStackLocation(Irp);
|
||||
|
||||
// access IrpTarget
|
||||
IrpTarget = (IIrpTarget *)IoStack->FileObject->FsContext2;
|
||||
IrpTarget = (IIrpTarget *)IoStack->FileObject->FsContext;
|
||||
|
||||
|
||||
// let IrpTarget handle request
|
||||
|
@ -141,7 +141,7 @@ Dispatch_fnSetSecurity(
|
|||
IoStack = IoGetCurrentIrpStackLocation(Irp);
|
||||
|
||||
// access IrpTarget
|
||||
IrpTarget = (IIrpTarget *)IoStack->FileObject->FsContext2;
|
||||
IrpTarget = (IIrpTarget *)IoStack->FileObject->FsContext;
|
||||
|
||||
|
||||
// let IrpTarget handle request
|
||||
|
@ -164,7 +164,7 @@ Dispatch_fnFastDeviceIoControl(
|
|||
IIrpTarget * IrpTarget;
|
||||
|
||||
// access IrpTarget
|
||||
IrpTarget = (IIrpTarget *)FileObject->FsContext2;
|
||||
IrpTarget = (IIrpTarget *)FileObject->FsContext;
|
||||
|
||||
// let IrpTarget handle request
|
||||
return IrpTarget->FastDeviceIoControl(FileObject, Wait, InputBuffer, InputBufferLength, OutputBuffer, OutputBufferLength, IoControlCode, IoStatus, DeviceObject);
|
||||
|
@ -186,7 +186,7 @@ Dispatch_fnFastRead(
|
|||
IIrpTarget * IrpTarget;
|
||||
|
||||
// access IrpTarget
|
||||
IrpTarget = (IIrpTarget *)FileObject->FsContext2;
|
||||
IrpTarget = (IIrpTarget *)FileObject->FsContext;
|
||||
|
||||
// let IrpTarget handle request
|
||||
return IrpTarget->FastRead(FileObject, FileOffset, Length, Wait, LockKey, Buffer, IoStatus, DeviceObject);
|
||||
|
@ -207,7 +207,7 @@ Dispatch_fnFastWrite(
|
|||
IIrpTarget * IrpTarget;
|
||||
|
||||
// access IrpTarget
|
||||
IrpTarget = (IIrpTarget *)FileObject->FsContext2;
|
||||
IrpTarget = (IIrpTarget *)FileObject->FsContext;
|
||||
// let IrpTarget handle request
|
||||
return IrpTarget->FastWrite(FileObject, FileOffset, Length, Wait, LockKey, Buffer, IoStatus, DeviceObject);
|
||||
}
|
||||
|
@ -242,7 +242,7 @@ NewDispatchObject(
|
|||
// get current irp stack location
|
||||
IoStack = IoGetCurrentIrpStackLocation(Irp);
|
||||
|
||||
IoStack->FileObject->FsContext2 = (PVOID)Target;
|
||||
IoStack->FileObject->FsContext = (PVOID)Target;
|
||||
|
||||
Status = KsAllocateObjectHeader(&ObjectHeader, CreateItemCount, CreateItem, Irp, &DispatchTable);
|
||||
DPRINT("KsAllocateObjectHeader result %x\n", Status);
|
||||
|
|
|
@ -180,7 +180,7 @@ IInterruptServiceRoutine(
|
|||
while (CurEntry != &This->m_ServiceRoutines)
|
||||
{
|
||||
Entry = CONTAINING_RECORD(CurEntry, SYNC_ENTRY, ListEntry);
|
||||
Status = Entry->SyncRoutine((CInterruptSync*)This, Entry->DynamicContext);
|
||||
Entry->SyncRoutine((CInterruptSync*)This, Entry->DynamicContext);
|
||||
CurEntry = CurEntry->Flink;
|
||||
}
|
||||
DPRINT("Returning TRUE with mode InterruptSyncModeAll\n");
|
||||
|
|
|
@ -147,7 +147,7 @@ CIrpQueue::AddMapping(
|
|||
PC_ASSERT(Header);
|
||||
|
||||
// dont exceed max frame size
|
||||
PC_ASSERT(m_MaxFrameSize >= Header->DataUsed);
|
||||
//PC_ASSERT(m_MaxFrameSize >= Header->DataUsed);
|
||||
|
||||
// increment num mappings
|
||||
InterlockedIncrement(&m_NumMappings);
|
||||
|
@ -282,7 +282,7 @@ CIrpQueue::UpdateMapping(
|
|||
|
||||
m_Irp->IoStatus.Information = StreamHeader->FrameExtent;
|
||||
|
||||
if (m_Irp->RequestorMode != KernelMode)
|
||||
if (m_Irp->RequestorMode == KernelMode)
|
||||
{
|
||||
// HACK - WDMAUD should pass PKSSTREAM_HEADERs
|
||||
ExFreePool(StreamHeader->Data);
|
||||
|
|
|
@ -17,16 +17,11 @@
|
|||
|
||||
#include <dmusicks.h>
|
||||
#include <kcom.h>
|
||||
#include "stdunk.h"
|
||||
#include "interfaces.hpp"
|
||||
#include <ks.h>
|
||||
#include <ksmedia.h>
|
||||
#include <stdio.h>
|
||||
#include <math.h>
|
||||
#include <intrin.h>
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
#define TAG_PORTCLASS 'SLCP'
|
||||
|
||||
#define PC_ASSERT(exp) \
|
||||
|
|
|
@ -139,7 +139,7 @@ PinPropertyHandler(
|
|||
IoStack = IoGetCurrentIrpStackLocation(Irp);
|
||||
|
||||
// Get the IrpTarget
|
||||
IrpTarget = (IIrpTarget*)IoStack->FileObject->FsContext2;
|
||||
IrpTarget = (IIrpTarget*)IoStack->FileObject->FsContext;
|
||||
// Get the parent
|
||||
Status = IrpTarget->QueryInterface(IID_IPort, (PVOID*)&Port);
|
||||
if (!NT_SUCCESS(Status))
|
||||
|
|
|
@ -168,6 +168,7 @@ CRegistryKey::NewSubKey(
|
|||
{
|
||||
ZwClose(hKey);
|
||||
delete RegistryKey;
|
||||
return Status;
|
||||
}
|
||||
|
||||
*RegistrySubKey = (PREGISTRYKEY)RegistryKey;
|
||||
|
|
|
@ -348,6 +348,14 @@ PcNewResourceList(
|
|||
delete NewList;
|
||||
}
|
||||
|
||||
if (!TranslatedResourceList)
|
||||
{
|
||||
//
|
||||
// empty resource list
|
||||
//
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
// calculate translated resource list size
|
||||
ResourceCount = TranslatedResourceList->List[0].PartialResourceList.Count;
|
||||
#ifdef _MSC_VER
|
||||
|
@ -371,7 +379,7 @@ PcNewResourceList(
|
|||
NewTranslatedResources = (PCM_RESOURCE_LIST)AllocateItem(PoolType, NewTranslatedSize, TAG_PORTCLASS);
|
||||
if (!NewTranslatedResources)
|
||||
{
|
||||
FreeItem(NewList, TAG_PORTCLASS);
|
||||
delete NewList;
|
||||
return STATUS_INSUFFICIENT_RESOURCES;
|
||||
}
|
||||
|
||||
|
@ -379,8 +387,7 @@ PcNewResourceList(
|
|||
NewUntranslatedResources = (PCM_RESOURCE_LIST)AllocateItem(PoolType, NewUntranslatedSize, TAG_PORTCLASS);
|
||||
if (!NewUntranslatedResources)
|
||||
{
|
||||
FreeItem(NewList, TAG_PORTCLASS);
|
||||
FreeItem(NewTranslatedResources, TAG_PORTCLASS);
|
||||
delete NewList;
|
||||
return STATUS_INSUFFICIENT_RESOURCES;
|
||||
}
|
||||
|
||||
|
|
|
@ -25,8 +25,8 @@ KsoGetIrpTargetFromFileObject(
|
|||
{
|
||||
PC_ASSERT(FileObject);
|
||||
|
||||
// IrpTarget is stored in FsContext2
|
||||
return (IIrpTarget*)FileObject->FsContext2;
|
||||
// IrpTarget is stored in FsContext
|
||||
return (IIrpTarget*)FileObject->FsContext;
|
||||
}
|
||||
|
||||
IIrpTarget *
|
||||
|
|
|
@ -554,6 +554,12 @@ CompareProductName(
|
|||
/* read DriverDescName value */
|
||||
PartialInformation = ReadKeyValue(hSubKey, &DriverDescName);
|
||||
|
||||
if (!PartialInformation)
|
||||
{
|
||||
/* failed to read driver desc key */
|
||||
return STATUS_UNSUCCESSFUL;
|
||||
}
|
||||
|
||||
/* copy key name */
|
||||
Length = min(ProductNameSize * sizeof(WCHAR), PartialInformation->DataLength);
|
||||
RtlMoveMemory(ProductName, (PVOID)PartialInformation->Data, Length);
|
||||
|
@ -948,16 +954,16 @@ WdmAudWriteCompletion(
|
|||
IN PIRP LowerIrp,
|
||||
IN PVOID Context)
|
||||
{
|
||||
PIRP Irp;
|
||||
//PIRP Irp;
|
||||
ASSERT(LowerIrp->PendingReturned == FALSE);
|
||||
/* get original irp */
|
||||
Irp = (PIRP)Context;
|
||||
//Irp = (PIRP)Context;
|
||||
|
||||
/* save status */
|
||||
Irp->IoStatus.Status = LowerIrp->IoStatus.Status;
|
||||
Irp->IoStatus.Information = LowerIrp->IoStatus.Information;
|
||||
//Irp->IoStatus.Status = LowerIrp->IoStatus.Status;
|
||||
//Irp->IoStatus.Information = LowerIrp->IoStatus.Information;
|
||||
/* complete request */
|
||||
IoCompleteRequest(Irp, IO_SOUND_INCREMENT);
|
||||
//IoCompleteRequest(Irp, IO_SOUND_INCREMENT);
|
||||
/* return success to free irp */
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
@ -1130,14 +1136,17 @@ WdmAudWrite(
|
|||
IoSetCompletionRoutine(LowerIrp, WdmAudWriteCompletion, (PVOID)Irp, TRUE, TRUE, TRUE);
|
||||
|
||||
/* mark irp as pending */
|
||||
IoMarkIrpPending(Irp);
|
||||
|
||||
//IoMarkIrpPending(Irp);
|
||||
Irp->IoStatus.Information = DeviceInfo->BufferSize;
|
||||
Irp->IoStatus.Status = STATUS_SUCCESS;
|
||||
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
||||
DPRINT1("Wrote %u\n", DeviceInfo->BufferSize);
|
||||
/* call the driver */
|
||||
Status = IoCallDriver(IoGetRelatedDeviceObject(FileObject), LowerIrp);
|
||||
|
||||
/* dereference file object */
|
||||
ObDereferenceObject(FileObject);
|
||||
|
||||
return STATUS_PENDING;
|
||||
return STATUS_SUCCESS;
|
||||
#endif
|
||||
}
|
||||
|
|
|
@ -79,10 +79,10 @@ SysAudioOpenVirtualDevice(
|
|||
Entry = GetListEntry(&DeviceExtension->KsAudioDeviceList, DeviceNumber);
|
||||
ASSERT(Entry != NULL);
|
||||
|
||||
/* store device entry in FsContext2
|
||||
/* store device entry in FsContext
|
||||
* see pin.c DispatchCreateSysAudioPin for details
|
||||
*/
|
||||
IoStack->FileObject->FsContext2 = (PVOID)Entry;
|
||||
IoStack->FileObject->FsContext = (PVOID)Entry;
|
||||
|
||||
return SetIrpIoStatus(Irp, STATUS_SUCCESS, 0);
|
||||
}
|
||||
|
|
|
@ -25,8 +25,8 @@ Pin_fnDeviceIoControl(
|
|||
/* Get current stack location */
|
||||
IoStack = IoGetCurrentIrpStackLocation(Irp);
|
||||
|
||||
/* The dispatch context is stored in the FsContext2 member */
|
||||
Context = (PDISPATCH_CONTEXT)IoStack->FileObject->FsContext2;
|
||||
/* The dispatch context is stored in the FsContext member */
|
||||
Context = (PDISPATCH_CONTEXT)IoStack->FileObject->FsContext;
|
||||
|
||||
/* Sanity check */
|
||||
ASSERT(Context);
|
||||
|
@ -76,8 +76,8 @@ Pin_fnRead(
|
|||
/* Get current stack location */
|
||||
IoStack = IoGetCurrentIrpStackLocation(Irp);
|
||||
|
||||
/* The dispatch context is stored in the FsContext2 member */
|
||||
Context = (PDISPATCH_CONTEXT)IoStack->FileObject->FsContext2;
|
||||
/* The dispatch context is stored in the FsContext member */
|
||||
Context = (PDISPATCH_CONTEXT)IoStack->FileObject->FsContext;
|
||||
|
||||
/* Sanity check */
|
||||
ASSERT(Context);
|
||||
|
@ -136,8 +136,8 @@ Pin_fnWrite(
|
|||
/* Get current stack location */
|
||||
IoStack = IoGetCurrentIrpStackLocation(Irp);
|
||||
|
||||
/* The dispatch context is stored in the FsContext2 member */
|
||||
Context = (PDISPATCH_CONTEXT)IoStack->FileObject->FsContext2;
|
||||
/* The dispatch context is stored in the FsContext member */
|
||||
Context = (PDISPATCH_CONTEXT)IoStack->FileObject->FsContext;
|
||||
|
||||
/* Sanity check */
|
||||
ASSERT(Context);
|
||||
|
@ -210,8 +210,8 @@ Pin_fnFlush(
|
|||
/* Get current stack location */
|
||||
IoStack = IoGetCurrentIrpStackLocation(Irp);
|
||||
|
||||
/* The dispatch context is stored in the FsContext2 member */
|
||||
Context = (PDISPATCH_CONTEXT)IoStack->FileObject->FsContext2;
|
||||
/* The dispatch context is stored in the FsContext member */
|
||||
Context = (PDISPATCH_CONTEXT)IoStack->FileObject->FsContext;
|
||||
|
||||
/* Sanity check */
|
||||
ASSERT(Context);
|
||||
|
@ -282,8 +282,8 @@ Pin_fnClose(
|
|||
/* Get current stack location */
|
||||
IoStack = IoGetCurrentIrpStackLocation(Irp);
|
||||
|
||||
/* The dispatch context is stored in the FsContext2 member */
|
||||
Context = (PDISPATCH_CONTEXT)IoStack->FileObject->FsContext2;
|
||||
/* The dispatch context is stored in the FsContext member */
|
||||
Context = (PDISPATCH_CONTEXT)IoStack->FileObject->FsContext;
|
||||
|
||||
if (Context->Handle)
|
||||
{
|
||||
|
@ -379,7 +379,7 @@ Pin_fnFastWrite(
|
|||
|
||||
DPRINT("Pin_fnFastWrite called DeviceObject %p Irp %p\n", DeviceObject);
|
||||
|
||||
Context = (PDISPATCH_CONTEXT)FileObject->FsContext2;
|
||||
Context = (PDISPATCH_CONTEXT)FileObject->FsContext;
|
||||
|
||||
if (Context->hMixerPin)
|
||||
{
|
||||
|
@ -404,7 +404,7 @@ Pin_fnFastWrite(
|
|||
|
||||
Status = KsStreamIo(RealFileObject, NULL, NULL, NULL, NULL, 0, IoStatus, Buffer, Length, KSSTREAM_WRITE, UserMode);
|
||||
|
||||
ObDereferenceObject(RealFileObject);
|
||||
//ObDereferenceObject(RealFileObject);
|
||||
|
||||
if (NT_SUCCESS(Status))
|
||||
return TRUE;
|
||||
|
@ -636,7 +636,6 @@ DispatchCreateSysAudioPin(
|
|||
IN PIRP Irp)
|
||||
{
|
||||
NTSTATUS Status = STATUS_SUCCESS;
|
||||
KSOBJECT_HEADER ObjectHeader;
|
||||
PIO_STACK_LOCATION IoStack;
|
||||
PKSAUDIO_DEVICE_ENTRY DeviceEntry;
|
||||
PKSPIN_CONNECT Connect = NULL;
|
||||
|
@ -650,10 +649,10 @@ DispatchCreateSysAudioPin(
|
|||
/* sanity checks */
|
||||
ASSERT(IoStack->FileObject);
|
||||
ASSERT(IoStack->FileObject->RelatedFileObject);
|
||||
ASSERT(IoStack->FileObject->RelatedFileObject->FsContext2);
|
||||
ASSERT(IoStack->FileObject->RelatedFileObject->FsContext);
|
||||
|
||||
/* get current attached virtual device */
|
||||
DeviceEntry = (PKSAUDIO_DEVICE_ENTRY)IoStack->FileObject->RelatedFileObject->FsContext2;
|
||||
DeviceEntry = (PKSAUDIO_DEVICE_ENTRY)IoStack->FileObject->RelatedFileObject->FsContext;
|
||||
|
||||
/* now validate pin connect request */
|
||||
Status = KsValidateConnectRequest(Irp, DeviceEntry->PinDescriptorsCount, DeviceEntry->PinDescriptors, &Connect);
|
||||
|
@ -681,7 +680,7 @@ DispatchCreateSysAudioPin(
|
|||
RtlZeroMemory(DispatchContext, sizeof(DISPATCH_CONTEXT));
|
||||
|
||||
/* allocate object header */
|
||||
Status = KsAllocateObjectHeader(&ObjectHeader, 0, NULL, Irp, &PinTable);
|
||||
Status = KsAllocateObjectHeader(&DispatchContext->ObjectHeader, 0, NULL, Irp, &PinTable);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
/* failed */
|
||||
|
@ -696,13 +695,13 @@ DispatchCreateSysAudioPin(
|
|||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
/* failed */
|
||||
KsFreeObjectHeader(ObjectHeader);
|
||||
KsFreeObjectHeader(DispatchContext->ObjectHeader);
|
||||
ExFreePool(DispatchContext);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* store dispatch context */
|
||||
IoStack->FileObject->FsContext2 = (PVOID)DispatchContext;
|
||||
IoStack->FileObject->FsContext = (PVOID)DispatchContext;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -22,8 +22,8 @@ typedef struct
|
|||
LIST_ENTRY Entry; // device entry for KsAudioDeviceList
|
||||
UNICODE_STRING DeviceName; // symbolic link of audio device
|
||||
|
||||
HANDLE Handle; // handle to audio sub device
|
||||
PFILE_OBJECT FileObject; // file objecto to audio sub device
|
||||
HANDLE Handle; // handle to audio device
|
||||
PFILE_OBJECT FileObject; // file objecto to audio device
|
||||
|
||||
PIN_INFO * Pins; // array of PIN_INFO
|
||||
ULONG PinDescriptorsCount; // number of pin descriptors
|
||||
|
@ -55,6 +55,7 @@ typedef struct
|
|||
|
||||
typedef struct
|
||||
{
|
||||
KSOBJECT_HEADER ObjectHeader; // pin object header
|
||||
HANDLE Handle; // audio irp pin handle
|
||||
ULONG PinId; // pin id of device
|
||||
PKSAUDIO_DEVICE_ENTRY AudioEntry; // pointer to audio device entry
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue