[CMAKE]
[reactos.git] / drivers / wdm / audio / sysaudio / pin.c
index a2271a9..0a665be 100644 (file)
@@ -149,7 +149,7 @@ Pin_fnClose(
         ZwClose(Context->hMixerPin);
     }
 
-    ExFreePool(Context);
+    FreeItem(Context);
 
     Irp->IoStatus.Status = STATUS_SUCCESS;
     Irp->IoStatus.Information = 0;
@@ -315,7 +315,7 @@ InstantiatePins(
         /* the audio irp pin didnt accept the input format
          * let's compute a compatible format
          */
-        MixerPinConnect = ExAllocatePool(NonPagedPool, sizeof(KSPIN_CONNECT) + sizeof(KSDATAFORMAT_WAVEFORMATEX));
+        MixerPinConnect = AllocateItem(NonPagedPool, sizeof(KSPIN_CONNECT) + sizeof(KSDATAFORMAT_WAVEFORMATEX));
         if (!MixerPinConnect)
         {
             /* not enough memory */
@@ -335,7 +335,7 @@ InstantiatePins(
         if (!NT_SUCCESS(Status))
         {
             DPRINT1("ComputeCompatibleFormat failed with %x\n", Status);
-            ExFreePool(MixerPinConnect);
+            FreeItem(MixerPinConnect);
             return Status;
         }
 
@@ -348,13 +348,13 @@ InstantiatePins(
             DPRINT1(" InputFormat: SampleRate %u Bits %u Channels %u\n", InputFormat->WaveFormatEx.nSamplesPerSec, InputFormat->WaveFormatEx.wBitsPerSample, InputFormat->WaveFormatEx.nChannels);
             DPRINT1("OutputFormat: SampleRate %u Bits %u Channels %u\n", OutputFormat->WaveFormatEx.nSamplesPerSec, OutputFormat->WaveFormatEx.wBitsPerSample, OutputFormat->WaveFormatEx.nChannels);
 
-            ExFreePool(MixerPinConnect);
+            FreeItem(MixerPinConnect);
             return Status;
         }
     }
 #endif
 
-    DeviceEntry->Pins[Connect->PinId].References = 0;
+    //DeviceEntry->Pins[Connect->PinId].References = 0;
 
     /* initialize dispatch context */
     DispatchContext->Handle = RealPinHandle;
@@ -378,13 +378,51 @@ InstantiatePins(
         if (!NT_SUCCESS(Status))
         {
             DPRINT1("Failed to create Mixer Pin with %x\n", Status);
-            ExFreePool(MixerPinConnect);
+            FreeItem(MixerPinConnect);
         }
     }
     /* done */
     return Status;
 }
 
+NTSTATUS
+GetConnectRequest(
+    IN PIRP Irp,
+    OUT PKSPIN_CONNECT * Result)
+{
+    PIO_STACK_LOCATION IoStack;
+    ULONG ObjectLength, ParametersLength;
+    PVOID Buffer;
+
+    /* get current irp stack */
+    IoStack = IoGetCurrentIrpStackLocation(Irp);
+
+    /* get object class length */
+    ObjectLength = (wcslen(KSSTRING_Pin) + 1) * sizeof(WCHAR);
+
+    /* check for minium length requirement */
+    if (ObjectLength  + sizeof(KSPIN_CONNECT) > IoStack->FileObject->FileName.MaximumLength)
+        return STATUS_UNSUCCESSFUL;
+
+    /* extract parameters length */
+    ParametersLength = IoStack->FileObject->FileName.MaximumLength - ObjectLength;
+
+    /* allocate buffer */
+    Buffer = AllocateItem(NonPagedPool, ParametersLength);
+    if (!Buffer)
+        return STATUS_INSUFFICIENT_RESOURCES;
+
+    /* copy parameters */
+    RtlMoveMemory(Buffer, &IoStack->FileObject->FileName.Buffer[ObjectLength / sizeof(WCHAR)], ParametersLength);
+
+    /* store result */
+    *Result = (PKSPIN_CONNECT)Buffer;
+
+    return STATUS_SUCCESS;
+}
+
+
+
 NTSTATUS
 NTAPI
 DispatchCreateSysAudioPin(
@@ -394,7 +432,7 @@ DispatchCreateSysAudioPin(
     NTSTATUS Status = STATUS_SUCCESS;
     PIO_STACK_LOCATION IoStack;
     PKSAUDIO_DEVICE_ENTRY DeviceEntry;
-    PKSPIN_CONNECT Connect = NULL;
+    PKSPIN_CONNECT Connect;
     PDISPATCH_CONTEXT DispatchContext;
 
     DPRINT("DispatchCreateSysAudioPin entered\n");
@@ -410,9 +448,6 @@ DispatchCreateSysAudioPin(
     /* get current attached virtual device */
     DeviceEntry = (PKSAUDIO_DEVICE_ENTRY)IoStack->FileObject->RelatedFileObject->FsContext;
 
-    /* now validate pin connect request */
-    Status = KsValidateConnectRequest(Irp, DeviceEntry->PinDescriptorsCount, DeviceEntry->PinDescriptors, &Connect);
-
     /* check for success */
     if (!NT_SUCCESS(Status))
     {
@@ -422,8 +457,21 @@ DispatchCreateSysAudioPin(
         return Status;
     }
 
+    /* get connect details */
+    Status = GetConnectRequest(Irp, &Connect);
+
+    /* check for success */
+    if (!NT_SUCCESS(Status))
+    {
+        /* failed to obtain connect details */
+        Irp->IoStatus.Status = Status;
+        IoCompleteRequest(Irp, IO_NO_INCREMENT);
+        return Status;
+    }
+
+
     /* allocate dispatch context */
-    DispatchContext = ExAllocatePool(NonPagedPool, sizeof(DISPATCH_CONTEXT));
+    DispatchContext = AllocateItem(NonPagedPool, sizeof(DISPATCH_CONTEXT));
     if (!DispatchContext)
     {
         /* failed */
@@ -440,7 +488,7 @@ DispatchCreateSysAudioPin(
     if (!NT_SUCCESS(Status))
     {
         /* failed */
-        ExFreePool(DispatchContext);
+        FreeItem(DispatchContext);
         Irp->IoStatus.Status = Status;
         IoCompleteRequest(Irp, IO_NO_INCREMENT);
         return Status;
@@ -452,7 +500,7 @@ DispatchCreateSysAudioPin(
     {
         /* failed */
         KsFreeObjectHeader(DispatchContext->ObjectHeader);
-        ExFreePool(DispatchContext);
+        FreeItem(DispatchContext);
     }
     else
     {