- Implement KsAcquireResetValue, KsCompletePendingRequest, KsAllocateExtraData

svn path=/trunk/; revision=42302
This commit is contained in:
Johannes Anderwald 2009-07-30 14:20:13 +00:00
parent f8107d7dc9
commit 974e0eca7e
4 changed files with 128 additions and 31 deletions

View file

@ -10,7 +10,7 @@
#include "priv.h" #include "priv.h"
/* /*
@unimplemented @implemented
*/ */
KSDDKAPI KSDDKAPI
NTSTATUS NTSTATUS
@ -19,8 +19,40 @@ KsAcquireResetValue(
IN PIRP Irp, IN PIRP Irp,
OUT KSRESET* ResetValue) OUT KSRESET* ResetValue)
{ {
UNIMPLEMENTED; PIO_STACK_LOCATION IoStack;
return STATUS_UNSUCCESSFUL; KSRESET* Value;
NTSTATUS Status = STATUS_SUCCESS;
/* get current irp stack */
IoStack = IoGetCurrentIrpStackLocation(Irp);
/* check if there is reset value provided */
if (IoStack->Parameters.DeviceIoControl.InputBufferLength < sizeof(KSRESET))
return STATUS_INVALID_PARAMETER;
if (Irp->RequestorMode == UserMode)
{
/* need to probe the buffer */
_SEH2_TRY
{
ProbeForRead(IoStack->Parameters.DeviceIoControl.Type3InputBuffer, sizeof(KSRESET), sizeof(UCHAR));
Value = (KSRESET*)IoStack->Parameters.DeviceIoControl.Type3InputBuffer;
*ResetValue = *Value;
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
/* Exception, get the error code */
Status = _SEH2_GetExceptionCode();
}
_SEH2_END;
}
else
{
Value = (KSRESET*)IoStack->Parameters.DeviceIoControl.Type3InputBuffer;
*ResetValue = *Value;
}
return Status;
} }
/* /*
@ -1551,10 +1583,8 @@ KsTerminateDevice(
} }
} }
/* /*
@unimplemented @implemented
*/ */
KSDDKAPI KSDDKAPI
VOID VOID
@ -1562,7 +1592,35 @@ NTAPI
KsCompletePendingRequest( KsCompletePendingRequest(
IN PIRP Irp) IN PIRP Irp)
{ {
PIO_STACK_LOCATION IoStack;
/* get current irp stack location */
IoStack = IoGetCurrentIrpStackLocation(Irp);
/* sanity check */
ASSERT(Irp->IoStatus.Status != STATUS_PENDING);
if (IoStack->MajorFunction != IRP_MJ_CLOSE)
{
/* can be completed immediately */
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return;
}
/* did close operation fail */
if (!NT_SUCCESS(Irp->IoStatus.Status))
{
/* closing failed, complete irp */
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return;
}
/* FIXME
* delete object / device header
* remove dead pin / filter instance
*/
UNIMPLEMENTED UNIMPLEMENTED
} }
/* /*

View file

@ -597,32 +597,22 @@ IKsDevice_Create(
/* increment create item reference count */ /* increment create item reference count */
InterlockedIncrement(&CreateItemEntry->ReferenceCount); InterlockedIncrement(&CreateItemEntry->ReferenceCount);
} }
/* acquire list lock */
IKsDevice_fnReleaseDevice((IKsDevice*)&DeviceHeader->lpVtblIKsDevice);
return Status;
} }
/* acquire list lock */ /* acquire list lock */
IKsDevice_fnReleaseDevice((IKsDevice*)&DeviceHeader->lpVtblIKsDevice); IKsDevice_fnReleaseDevice((IKsDevice*)&DeviceHeader->lpVtblIKsDevice);
DPRINT1("No item found for Request %p\n", IoStack->FileObject->FileName.Buffer); if (Status != STATUS_PENDING)
{
Irp->IoStatus.Information = 0;
/* set return status */
Irp->IoStatus.Status = Status;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
}
Irp->IoStatus.Information = 0; return Status;
/* set return status */
Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return STATUS_UNSUCCESSFUL;
/* release lock */
IKsDevice_fnRelease((IKsDevice*)&DeviceHeader->lpVtblIKsDevice);
Irp->IoStatus.Information = 0;
/* set return status */
Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return STATUS_UNSUCCESSFUL;
} }
/* /*

View file

@ -430,7 +430,7 @@ IKsFilter_DispatchClose(
Status = This->Factory->FilterDescriptor->Dispatch->Close(&This->Filter, Irp); Status = This->Factory->FilterDescriptor->Dispatch->Close(&This->Filter, Irp);
} }
if (Status != STATUS_PENDING) if (NT_SUCCESS(Status) && Status != STATUS_PENDING)
{ {
/* save the result */ /* save the result */
Irp->IoStatus.Status = Status; Irp->IoStatus.Status = Status;
@ -440,9 +440,6 @@ IKsFilter_DispatchClose(
/* remove our instance from the filter factory */ /* remove our instance from the filter factory */
This->FilterFactory->lpVtbl->RemoveFilterInstance(This->FilterFactory, Filter); This->FilterFactory->lpVtbl->RemoveFilterInstance(This->FilterFactory, Filter);
/* now release the acquired interface */
Filter->lpVtbl->Release(Filter);
/* free object header */ /* free object header */
KsFreeObjectHeader(This->ObjectHeader); KsFreeObjectHeader(This->ObjectHeader);
} }

View file

@ -594,7 +594,7 @@ KsProbeStreamIrp(
} }
/* /*
@unimplemented @implemented
*/ */
KSDDKAPI KSDDKAPI
NTSTATUS NTSTATUS
@ -604,8 +604,60 @@ KsAllocateExtraData(
IN ULONG ExtraSize, IN ULONG ExtraSize,
OUT PVOID* ExtraBuffer) OUT PVOID* ExtraBuffer)
{ {
UNIMPLEMENTED; PIO_STACK_LOCATION IoStack;
return STATUS_UNSUCCESSFUL; ULONG Count, Index;
PUCHAR Buffer, BufferOrg;
PKSSTREAM_HEADER Header;
NTSTATUS Status = STATUS_SUCCESS;
/* get current irp stack */
IoStack = IoGetCurrentIrpStackLocation(Irp);
/* sanity check */
ASSERT(IoStack->Parameters.DeviceIoControl.InputBufferLength >= sizeof(KSSTREAM_HEADER));
/* get total length */
Count = IoStack->Parameters.DeviceIoControl.InputBufferLength / sizeof(KSSTREAM_HEADER);
/* allocate buffer */
Buffer = BufferOrg = AllocateItem(NonPagedPool, Count * (sizeof(KSSTREAM_HEADER) + ExtraSize));
if (!Buffer)
return STATUS_INSUFFICIENT_RESOURCES;
_SEH2_TRY
{
/* get input buffer */
Header = (PKSSTREAM_HEADER)IoStack->Parameters.DeviceIoControl.Type3InputBuffer;
for(Index = 0; Index < Count; Index++)
{
/* copy stream header */
RtlMoveMemory(Buffer, Header, sizeof(KSSTREAM_HEADER));
/* move to next header */
Header++;
/* increment output buffer offset */
Buffer += sizeof(KSSTREAM_HEADER) + ExtraSize;
}
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
/* Exception, get the error code */
Status = _SEH2_GetExceptionCode();
}
_SEH2_END;
if (!NT_SUCCESS(Status))
{
/* free buffer on exception */
FreeItem(Buffer);
return Status;
}
/* store result */
*ExtraBuffer = BufferOrg;
/* done */
return STATUS_SUCCESS;
} }
/* /*