- Remove hack in IDmaChannel::PhysicalAddress as it will hide the bug and not prevent es1370mp from crashing

- Fix a horrible where the Mdl was not created for the common buffer
- Might fix other audio related crashes
- Forward IRP_MN_QUERY_INTERFACE to next lower device object
- Fix & enable PcForwardIrpSynchronous implementation
- Add debug print to IServiceGroup when a unknown IID is requested

svn path=/trunk/; revision=40001
This commit is contained in:
Johannes Anderwald 2009-03-13 14:07:03 +00:00
parent d45772c95a
commit 360606f98b
3 changed files with 29 additions and 18 deletions

View file

@ -125,7 +125,7 @@ IDmaChannelSlave_fnAllocateBuffer(
This->BufferSize = BufferSize;
This->AllocatedBufferSize = BufferSize;
DPRINT1("IDmaChannelSlave_fnAllocateBuffer Success Buffer %u Address %x %p\n", BufferSize, This->Address, PhysicalAddressConstraint);
DPRINT1("IDmaChannelSlave_fnAllocateBuffer Success Buffer %p BufferSize %u Address %x\n", This->Buffer, BufferSize, This->Address);
return STATUS_SUCCESS;
}
@ -227,17 +227,11 @@ IDmaChannelSlave_fnPhysicalAdress(
IN IDmaChannelSlave * iface)
{
PHYSICAL_ADDRESS Address;
IDmaChannelSlaveImpl * This = (IDmaChannelSlaveImpl*)iface;
DPRINT("IDmaChannelSlave_PhysicalAdress: This %p Virtuell %p Physical High %x Low %x%\n", This, This->Buffer, This->Address.HighPart, This->Address.LowPart);
#if 1
/// HACK
/// Prevent ES1371 driver from crashing by returning the vaddr instead of physical address
Address.QuadPart = (ULONG_PTR)This->Buffer;
#else
Address.QuadPart = This->Address.QuadPart;
#endif
Address = This->Address;
return Address;
}
@ -351,7 +345,7 @@ IDmaChannelSlave_fnStart(
if (!This->Mdl)
{
This->Mdl = IoAllocateMdl(&This->Buffer, This->MaximumBufferSize, FALSE, FALSE, NULL);
This->Mdl = IoAllocateMdl(This->Buffer, This->MaximumBufferSize, FALSE, FALSE, NULL);
if (!This->Mdl)
{
return STATUS_INSUFFICIENT_RESOURCES;

View file

@ -135,12 +135,8 @@ PortClsPnp(
return STATUS_SUCCESS;
case IRP_MN_QUERY_INTERFACE:
DPRINT1("FIXME: IRP_MN_QUERY_INTERFACE: call next lower device object\n");
/* FIXME
* call next lower device object */
Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return STATUS_UNSUCCESSFUL;
DPRINT("IRP_MN_QUERY_INTERFACE\n");
return PcForwardIrpSynchronous(DeviceObject, Irp);
case IRP_MN_QUERY_DEVICE_RELATIONS:
Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
@ -264,6 +260,21 @@ PcCompleteIrp(
return STATUS_UNSUCCESSFUL;
}
NTSTATUS
NTAPI
CompletionRoutine(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN PVOID Context)
{
if (Irp->PendingReturned == TRUE)
{
KeSetEvent ((PKEVENT) Context, IO_NO_INCREMENT, FALSE);
}
return STATUS_MORE_PROCESSING_REQUIRED;
}
/*
* @implemented
*/
@ -279,15 +290,16 @@ PcForwardIrpSynchronous(
DPRINT1("PcForwardIrpSynchronous\n");
DeviceExt = (PPCLASS_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
return STATUS_SUCCESS;
/* initialize the notification event */
KeInitializeEvent(&Event, NotificationEvent, FALSE);
/* copy the current stack location */
IoCopyCurrentIrpStackLocationToNext(Irp);
DPRINT1("PcForwardIrpSynchronous %p Irp %p\n", DeviceExt->PrevDeviceObject, Irp);
IoSetCompletionRoutine(Irp, CompletionRoutine, (PVOID)&Event, TRUE, TRUE, TRUE);
/* now call the driver */
Status = IoCallDriver(DeviceExt->PrevDeviceObject, Irp);
/* did the request complete yet */

View file

@ -35,6 +35,7 @@ IServiceGroup_fnQueryInterface(
IN REFIID refiid,
OUT PVOID* Output)
{
WCHAR Buffer[100];
IServiceGroupImpl * This = (IServiceGroupImpl*)iface;
if (IsEqualGUIDAligned(refiid, &IID_IServiceGroup) ||
IsEqualGUIDAligned(refiid, &IID_IServiceSink) ||
@ -44,6 +45,10 @@ IServiceGroup_fnQueryInterface(
InterlockedIncrement(&This->ref);
return STATUS_SUCCESS;
}
StringFromCLSID(refiid, Buffer);
DPRINT1("IPortWaveCyclic_fnQueryInterface no interface!!! iface %S\n", Buffer);
return STATUS_UNSUCCESSFUL;
}