ZwClose(Context->hMixerPin);
}
- ExFreePool(Context);
+ FreeItem(Context);
Irp->IoStatus.Status = STATUS_SUCCESS;
Irp->IoStatus.Information = 0;
/* 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 */
if (!NT_SUCCESS(Status))
{
DPRINT1("ComputeCompatibleFormat failed with %x\n", Status);
- ExFreePool(MixerPinConnect);
+ FreeItem(MixerPinConnect);
return Status;
}
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;
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(
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");
/* 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))
{
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 */
if (!NT_SUCCESS(Status))
{
/* failed */
- ExFreePool(DispatchContext);
+ FreeItem(DispatchContext);
Irp->IoStatus.Status = Status;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return Status;
{
/* failed */
KsFreeObjectHeader(DispatchContext->ObjectHeader);
- ExFreePool(DispatchContext);
+ FreeItem(DispatchContext);
}
else
{