}
// 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)
{
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++)