}
// get first stream header
- Header = (PKSSTREAM_HEADER)Irp->AssociatedIrp.SystemBuffer;
+
+ if (Irp->RequestorMode == UserMode)
+ Header = (PKSSTREAM_HEADER)Irp->AssociatedIrp.SystemBuffer;
+ else
+ Header = (PKSSTREAM_HEADER)Irp->UserBuffer;
+
+ // sanity check
+ PC_ASSERT(Header);
// calculate num headers
NumHeaders = IoStack->Parameters.DeviceIoControl.OutputBufferLength / Header->Size;
// get first audio buffer
Mdl = Irp->MdlAddress;
-
+ // sanity check
+ PC_ASSERT(Mdl);
// store the current stream header
Irp->Tail.Overlay.DriverContext[OFFSET_STREAMHEADER] = (PVOID)Header;
// store current header index
Irp->Tail.Overlay.DriverContext[OFFSET_HEADERINDEX] = UlongToPtr(0);
-
NumData = 0;
// prepare all headers
for(Index = 0; Index < NumHeaders; Index++)
PC_ASSERT(Header);
PC_ASSERT(Mdl);
- Header->Data = MmGetSystemAddressForMdlSafe(Mdl, NormalPagePriority);
+ if (Irp->RequestorMode == UserMode)
+ {
+ Header->Data = MmGetSystemAddressForMdlSafe(Mdl, NormalPagePriority);
+ }
if (!Header->Data)
{
if (!Irp)
{
DPRINT("NoIrp\n");
- return STATUS_UNSUCCESSFUL;
// no irp available, use silence buffer
*Buffer = (PUCHAR)m_SilenceBuffer;
*BufferSize = m_MaxFrameSize;
return;
}
- // irp has been processed completly
+ // irp has been processed completly
NumData = 0;
- StreamHeader = (PKSSTREAM_HEADER)m_Irp->AssociatedIrp.SystemBuffer;
+ if (m_Irp->RequestorMode == KernelMode)
+ StreamHeader = (PKSSTREAM_HEADER)m_Irp->UserBuffer;
+ else
+ StreamHeader = (PKSSTREAM_HEADER)m_Irp->AssociatedIrp.SystemBuffer;
// loop all stream headers
for(Index = 0; Index < STREAMHEADER_COUNT(m_Irp); Index++)
NTAPI
CIrpQueue::CancelBuffers()
{
+ // is there an active irp
+ if (m_Irp)
+ {
+ // re-insert it to cancelable queue
+ KsAddIrpToCancelableQueue(&m_IrpList, &m_IrpListLock, m_Irp, KsListEntryTail, NULL);
+ //set it to zero
+ m_Irp = NULL;
+ }
+ // cancel all irps
+ KsCancelIo(&m_IrpList, &m_IrpListLock);
+ // reset stream start flag
m_StartStream = FALSE;
+ // done
return TRUE;
}