[PORTCLS]
[reactos.git] / reactos / drivers / wdm / audio / backpln / portcls / irpstream.cpp
index e699964..aaa707b 100644 (file)
@@ -145,7 +145,14 @@ CIrpQueue::AddMapping(
     }
 
     // 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;
@@ -156,7 +163,8 @@ CIrpQueue::AddMapping(
 
     // 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;
@@ -166,7 +174,6 @@ CIrpQueue::AddMapping(
     // store current header index
     Irp->Tail.Overlay.DriverContext[OFFSET_HEADERINDEX] = UlongToPtr(0);
 
-
     NumData = 0;
     // prepare all headers
     for(Index = 0; Index < NumHeaders; Index++)
@@ -175,7 +182,10 @@ CIrpQueue::AddMapping(
         PC_ASSERT(Header);
         PC_ASSERT(Mdl);
 
-        Header->Data = MmGetSystemAddressForMdlSafe(Mdl, NormalPagePriority);
+        if (Irp->RequestorMode == UserMode)
+        {
+            Header->Data = MmGetSystemAddressForMdlSafe(Mdl, NormalPagePriority);
+        }
 
         if (!Header->Data)
         {
@@ -257,7 +267,6 @@ CIrpQueue::GetMapping(
     if (!Irp)
     {
         DPRINT("NoIrp\n");
-        return STATUS_UNSUCCESSFUL;
         // no irp available, use silence buffer
         *Buffer = (PUCHAR)m_SilenceBuffer;
         *BufferSize = m_MaxFrameSize;
@@ -344,10 +353,13 @@ CIrpQueue::UpdateMapping(
             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++)
@@ -441,8 +453,20 @@ BOOL
 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;
 }