- Improve user mode buffer probing

svn path=/trunk/; revision=41467
This commit is contained in:
Johannes Anderwald 2009-06-19 10:50:19 +00:00
parent 97aea8189d
commit f791b1fa91
2 changed files with 30 additions and 2 deletions

View file

@ -679,6 +679,8 @@ WdmAudWrite(
PCONTEXT_WRITE Packet; PCONTEXT_WRITE Packet;
PFILE_OBJECT FileObject; PFILE_OBJECT FileObject;
IO_STATUS_BLOCK IoStatusBlock; IO_STATUS_BLOCK IoStatusBlock;
PMDL Mdl;
PVOID SystemBuffer;
IoStack = IoGetCurrentIrpStackLocation(Irp); IoStack = IoGetCurrentIrpStackLocation(Irp);
@ -746,10 +748,19 @@ WdmAudWrite(
} }
Packet->Header.Data = Buffer; Packet->Header.Data = Buffer;
Mdl = IoAllocateMdl(DeviceInfo->Buffer, DeviceInfo->BufferSize, FALSE, FALSE, FALSE);
if (!Mdl)
{
/* no memory */
ExFreePool(Packet);
ObDereferenceObject(FileObject);
ExFreePool(Buffer);
return SetIrpIoStatus(Irp, STATUS_NO_MEMORY, 0);
}
_SEH2_TRY _SEH2_TRY
{ {
ProbeForRead(DeviceInfo->Buffer, DeviceInfo->BufferSize, TYPE_ALIGNMENT(char)); MmProbeAndLockPages(Mdl, UserMode, IoReadAccess);
RtlMoveMemory(Buffer, DeviceInfo->Buffer, DeviceInfo->BufferSize);
} }
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{ {
@ -763,10 +774,26 @@ WdmAudWrite(
DPRINT1("Invalid buffer supplied\n"); DPRINT1("Invalid buffer supplied\n");
ExFreePool(Buffer); ExFreePool(Buffer);
ExFreePool(Packet); ExFreePool(Packet);
IoFreeMdl(Mdl);
ObDereferenceObject(FileObject); ObDereferenceObject(FileObject);
return SetIrpIoStatus(Irp, Status, 0); return SetIrpIoStatus(Irp, Status, 0);
} }
SystemBuffer = MmGetSystemAddressForMdlSafe(Mdl, NormalPagePriority );
if (!SystemBuffer)
{
DPRINT1("Invalid buffer supplied\n");
ExFreePool(Buffer);
ExFreePool(Packet);
IoFreeMdl(Mdl);
ObDereferenceObject(FileObject);
return SetIrpIoStatus(Irp, Status, 0);
}
RtlMoveMemory(Buffer, SystemBuffer, DeviceInfo->BufferSize);
MmUnlockPages(Mdl);
IoFreeMdl(Mdl);
KsStreamIo(FileObject, NULL, NULL, NULL, NULL, 0, &IoStatusBlock, Packet, sizeof(CONTEXT_WRITE), KSSTREAM_WRITE, KernelMode); KsStreamIo(FileObject, NULL, NULL, NULL, NULL, 0, &IoStatusBlock, Packet, sizeof(CONTEXT_WRITE), KSSTREAM_WRITE, KernelMode);
ObDereferenceObject(FileObject); ObDereferenceObject(FileObject);
return IoStatusBlock.Status; return IoStatusBlock.Status;

View file

@ -204,6 +204,7 @@ WdmAudCleanup(
{ {
for (Index = 0; Index < pClient->NumPins; Index++) for (Index = 0; Index < pClient->NumPins; Index++)
{ {
DPRINT("Index %u Pin %p Type %x\n", Index, pClient->hPins[Index].Handle, pClient->hPins[Index].Type);
if (pClient->hPins[Index].Handle && pClient->hPins[Index].Type != MIXER_DEVICE_TYPE) if (pClient->hPins[Index].Handle && pClient->hPins[Index].Type != MIXER_DEVICE_TYPE)
{ {
ZwClose(pClient->hPins[Index].Handle); ZwClose(pClient->hPins[Index].Handle);