mirror of
https://github.com/reactos/reactos.git
synced 2025-06-03 00:10:39 +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"
|
||||
|
||||
/*
|
||||
@unimplemented
|
||||
@implemented
|
||||
*/
|
||||
KSDDKAPI
|
||||
NTSTATUS
|
||||
|
@ -19,8 +19,40 @@ KsAcquireResetValue(
|
|||
IN PIRP Irp,
|
||||
OUT KSRESET* ResetValue)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
return STATUS_UNSUCCESSFUL;
|
||||
PIO_STACK_LOCATION IoStack;
|
||||
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
|
||||
VOID
|
||||
|
@ -1562,7 +1592,35 @@ NTAPI
|
|||
KsCompletePendingRequest(
|
||||
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
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -597,32 +597,22 @@ IKsDevice_Create(
|
|||
/* increment create item reference count */
|
||||
InterlockedIncrement(&CreateItemEntry->ReferenceCount);
|
||||
}
|
||||
|
||||
/* acquire list lock */
|
||||
IKsDevice_fnReleaseDevice((IKsDevice*)&DeviceHeader->lpVtblIKsDevice);
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* acquire list lock */
|
||||
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;
|
||||
/* set return status */
|
||||
Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
|
||||
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
||||
return STATUS_UNSUCCESSFUL;
|
||||
return Status;
|
||||
|
||||
/* 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);
|
||||
}
|
||||
|
||||
if (Status != STATUS_PENDING)
|
||||
if (NT_SUCCESS(Status) && Status != STATUS_PENDING)
|
||||
{
|
||||
/* save the result */
|
||||
Irp->IoStatus.Status = Status;
|
||||
|
@ -440,9 +440,6 @@ IKsFilter_DispatchClose(
|
|||
/* remove our instance from the filter factory */
|
||||
This->FilterFactory->lpVtbl->RemoveFilterInstance(This->FilterFactory, Filter);
|
||||
|
||||
/* now release the acquired interface */
|
||||
Filter->lpVtbl->Release(Filter);
|
||||
|
||||
/* free object header */
|
||||
KsFreeObjectHeader(This->ObjectHeader);
|
||||
}
|
||||
|
|
|
@ -594,7 +594,7 @@ KsProbeStreamIrp(
|
|||
}
|
||||
|
||||
/*
|
||||
@unimplemented
|
||||
@implemented
|
||||
*/
|
||||
KSDDKAPI
|
||||
NTSTATUS
|
||||
|
@ -604,8 +604,60 @@ KsAllocateExtraData(
|
|||
IN ULONG ExtraSize,
|
||||
OUT PVOID* ExtraBuffer)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
return STATUS_UNSUCCESSFUL;
|
||||
PIO_STACK_LOCATION IoStack;
|
||||
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…
Reference in a new issue