Don't change PortData pointer, as it is allocated memory, and so, it is easier to free it when needed.

svn path=/trunk/; revision=23010
This commit is contained in:
Hervé Poussineau 2006-07-11 13:38:59 +00:00
parent 9976565e9f
commit 05917e3fee
2 changed files with 26 additions and 16 deletions

View file

@ -370,6 +370,11 @@ cleanup:
DeviceExtension->ReadIsPending = FALSE; DeviceExtension->ReadIsPending = FALSE;
DeviceExtension->InputCount = 0; DeviceExtension->InputCount = 0;
DeviceExtension->PortData = ExAllocatePool(NonPagedPool, DeviceExtension->DriverExtension->DataQueueSize * sizeof(KEYBOARD_INPUT_DATA)); DeviceExtension->PortData = ExAllocatePool(NonPagedPool, DeviceExtension->DriverExtension->DataQueueSize * sizeof(KEYBOARD_INPUT_DATA));
if (!DeviceExtension->PortData)
{
ExFreePool(DeviceNameU.Buffer);
return STATUS_INSUFFICIENT_RESOURCES;
}
Fdo->Flags |= DO_POWER_PAGABLE; Fdo->Flags |= DO_POWER_PAGABLE;
Fdo->Flags |= DO_BUFFERED_IO; /* FIXME: Why is it needed for 1st stage setup? */ Fdo->Flags |= DO_BUFFERED_IO; /* FIXME: Why is it needed for 1st stage setup? */
Fdo->Flags &= ~DO_DEVICE_INITIALIZING; Fdo->Flags &= ~DO_DEVICE_INITIALIZING;
@ -509,13 +514,12 @@ ClassCallback(
* Move the input data from the port data queue to our class data * Move the input data from the port data queue to our class data
* queue. * queue.
*/ */
RtlMoveMemory( RtlCopyMemory(
ClassDeviceExtension->PortData, &ClassDeviceExtension->PortData[ClassDeviceExtension->InputCount],
(PCHAR)DataStart, (PCHAR)DataStart,
sizeof(KEYBOARD_INPUT_DATA) * ReadSize); sizeof(KEYBOARD_INPUT_DATA) * ReadSize);
/* Move the pointer and counter up */ /* Move the counter up */
ClassDeviceExtension->PortData += ReadSize;
ClassDeviceExtension->InputCount += ReadSize; ClassDeviceExtension->InputCount += ReadSize;
(*ConsumedCount) += ReadSize; (*ConsumedCount) += ReadSize;
@ -681,6 +685,8 @@ ClassAddDevice(
return STATUS_SUCCESS; return STATUS_SUCCESS;
cleanup: cleanup:
if (!(Fdo->Flags & DO_DEVICE_INITIALIZING))
DPRINT1("FIXME: Need to send IOCTL_INTERNAL_*_DISCONNECT\n");
if (DeviceExtension) if (DeviceExtension)
{ {
if (DeviceExtension->LowerDevice) if (DeviceExtension->LowerDevice)
@ -717,19 +723,18 @@ ClassStartIo(
Status = FillOneEntry( Status = FillOneEntry(
DeviceObject, DeviceObject,
Irp, Irp,
DeviceExtension->PortData - DeviceExtension->InputCount); &DeviceExtension->PortData[DeviceExtension->InputCount - 1]);
if (NT_SUCCESS(Status)) if (NT_SUCCESS(Status))
{ {
if (DeviceExtension->InputCount > 1) if (DeviceExtension->InputCount > 1)
{ {
RtlMoveMemory( RtlMoveMemory(
DeviceExtension->PortData - DeviceExtension->InputCount, &DeviceExtension->PortData[1],
DeviceExtension->PortData - DeviceExtension->InputCount + 1, &DeviceExtension->PortData[0],
(DeviceExtension->InputCount - 1) * sizeof(KEYBOARD_INPUT_DATA)); (DeviceExtension->InputCount - 1) * sizeof(KEYBOARD_INPUT_DATA));
} }
DeviceExtension->PortData--;
DeviceExtension->InputCount--; DeviceExtension->InputCount--;
DeviceExtension->ReadIsPending = FALSE; DeviceExtension->ReadIsPending = FALSE;

View file

@ -347,6 +347,11 @@ cleanup:
DeviceExtension->ReadIsPending = FALSE; DeviceExtension->ReadIsPending = FALSE;
DeviceExtension->InputCount = 0; DeviceExtension->InputCount = 0;
DeviceExtension->PortData = ExAllocatePool(NonPagedPool, DeviceExtension->DriverExtension->DataQueueSize * sizeof(MOUSE_INPUT_DATA)); DeviceExtension->PortData = ExAllocatePool(NonPagedPool, DeviceExtension->DriverExtension->DataQueueSize * sizeof(MOUSE_INPUT_DATA));
if (!DeviceExtension->PortData)
{
ExFreePool(DeviceNameU.Buffer);
return STATUS_INSUFFICIENT_RESOURCES;
}
Fdo->Flags |= DO_POWER_PAGABLE; Fdo->Flags |= DO_POWER_PAGABLE;
Fdo->Flags &= ~DO_DEVICE_INITIALIZING; Fdo->Flags &= ~DO_DEVICE_INITIALIZING;
@ -485,13 +490,12 @@ ClassCallback(
* Move the input data from the port data queue to our class data * Move the input data from the port data queue to our class data
* queue. * queue.
*/ */
RtlMoveMemory( RtlCopyMemory(
ClassDeviceExtension->PortData, &ClassDeviceExtension->PortData[ClassDeviceExtension->InputCount],
(PCHAR)DataStart, (PCHAR)DataStart,
sizeof(MOUSE_INPUT_DATA) * ReadSize); sizeof(MOUSE_INPUT_DATA) * ReadSize);
/* Move the pointer and counter up */ /* Move the counter up */
ClassDeviceExtension->PortData += ReadSize;
ClassDeviceExtension->InputCount += ReadSize; ClassDeviceExtension->InputCount += ReadSize;
(*ConsumedCount) += ReadSize; (*ConsumedCount) += ReadSize;
@ -657,6 +661,8 @@ ClassAddDevice(
return STATUS_SUCCESS; return STATUS_SUCCESS;
cleanup: cleanup:
if (!(Fdo->Flags & DO_DEVICE_INITIALIZING))
DPRINT1("FIXME: Need to send IOCTL_INTERNAL_*_DISCONNECT\n");
if (DeviceExtension) if (DeviceExtension)
{ {
if (DeviceExtension->LowerDevice) if (DeviceExtension->LowerDevice)
@ -693,19 +699,18 @@ ClassStartIo(
Status = FillOneEntry( Status = FillOneEntry(
DeviceObject, DeviceObject,
Irp, Irp,
DeviceExtension->PortData - DeviceExtension->InputCount); &DeviceExtension->PortData[DeviceExtension->InputCount - 1]);
if (NT_SUCCESS(Status)) if (NT_SUCCESS(Status))
{ {
if (DeviceExtension->InputCount > 1) if (DeviceExtension->InputCount > 1)
{ {
RtlMoveMemory( RtlMoveMemory(
DeviceExtension->PortData - DeviceExtension->InputCount, &DeviceExtension->PortData[1],
DeviceExtension->PortData - DeviceExtension->InputCount + 1, &DeviceExtension->PortData[0],
(DeviceExtension->InputCount - 1) * sizeof(MOUSE_INPUT_DATA)); (DeviceExtension->InputCount - 1) * sizeof(MOUSE_INPUT_DATA));
} }
DeviceExtension->PortData--;
DeviceExtension->InputCount--; DeviceExtension->InputCount--;
DeviceExtension->ReadIsPending = FALSE; DeviceExtension->ReadIsPending = FALSE;