mirror of
https://github.com/reactos/reactos.git
synced 2025-06-10 04:14:53 +00:00
- Implement KsAcquireResetValue, KsCompletePendingRequest, KsAllocateExtraData
svn path=/trunk/; revision=42302
This commit is contained in:
parent
f8107d7dc9
commit
974e0eca7e
4 changed files with 128 additions and 31 deletions
|
@ -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
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue