- Fixed the buffer handling for ioctl requests and direct access

input buffers (METHODE_IN_DIRECT, output buffer from caller).

svn path=/trunk/; revision=4388
This commit is contained in:
Hartmut Birr 2003-03-21 21:09:42 +00:00
parent 99146c71b3
commit a9b1cd3b93
7 changed files with 57 additions and 50 deletions

View file

@ -1,4 +1,4 @@
/* $Id: blue.c,v 1.36 2003/03/09 21:43:37 hbirr Exp $ /* $Id: blue.c,v 1.37 2003/03/21 21:09:40 hbirr Exp $
* *
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
@ -454,7 +454,7 @@ ScrIoControl(PDEVICE_OBJECT DeviceObject,
offset = (Buf->dwCoord.Y * DeviceExtension->Columns * 2) + offset = (Buf->dwCoord.Y * DeviceExtension->Columns * 2) +
(Buf->dwCoord.X * 2) + 1; (Buf->dwCoord.X * 2) + 1;
for (dwCount = 0; dwCount < stk->Parameters.Write.Length; dwCount++, pAttr++) for (dwCount = 0; dwCount < stk->Parameters.DeviceIoControl.OutputBufferLength; dwCount++, pAttr++)
{ {
(char) *pAttr = vidmem[offset + (dwCount * 2)]; (char) *pAttr = vidmem[offset + (dwCount * 2)];
} }
@ -478,7 +478,7 @@ ScrIoControl(PDEVICE_OBJECT DeviceObject,
offset = (pCoord->Y * DeviceExtension->Columns * 2) + offset = (pCoord->Y * DeviceExtension->Columns * 2) +
(pCoord->X * 2) + 1; (pCoord->X * 2) + 1;
for (dwCount = 0; dwCount < (stk->Parameters.Write.Length - sizeof( COORD )); dwCount++, pAttr++) for (dwCount = 0; dwCount < (stk->Parameters.DeviceIoControl.InputBufferLength - sizeof( COORD )); dwCount++, pAttr++)
{ {
vidmem[offset + (dwCount * 2)] = *pAttr; vidmem[offset + (dwCount * 2)] = *pAttr;
} }
@ -531,7 +531,7 @@ ScrIoControl(PDEVICE_OBJECT DeviceObject,
offset = (Buf->dwCoord.Y * DeviceExtension->Columns * 2) + offset = (Buf->dwCoord.Y * DeviceExtension->Columns * 2) +
(Buf->dwCoord.X * 2); (Buf->dwCoord.X * 2);
for (dwCount = 0; dwCount < stk->Parameters.Write.Length; dwCount++, pChar++) for (dwCount = 0; dwCount < stk->Parameters.DeviceIoControl.OutputBufferLength; dwCount++, pChar++)
{ {
*pChar = vidmem[offset + (dwCount * 2)]; *pChar = vidmem[offset + (dwCount * 2)];
} }
@ -556,7 +556,7 @@ ScrIoControl(PDEVICE_OBJECT DeviceObject,
offset = (pCoord->Y * DeviceExtension->Columns * 2) + offset = (pCoord->Y * DeviceExtension->Columns * 2) +
(pCoord->X * 2); (pCoord->X * 2);
for (dwCount = 0; dwCount < (stk->Parameters.Write.Length - sizeof( COORD )); dwCount++, pChar++) for (dwCount = 0; dwCount < (stk->Parameters.DeviceIoControl.InputBufferLength - sizeof( COORD )); dwCount++, pChar++)
{ {
vidmem[offset + (dwCount * 2)] = *pChar; vidmem[offset + (dwCount * 2)] = *pChar;
} }

View file

@ -16,7 +16,7 @@
* along with this program; if not, write to the Free Software * along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/ */
/* $Id: class2.c,v 1.31 2003/01/28 17:33:18 hbirr Exp $ /* $Id: class2.c,v 1.32 2003/03/21 21:09:41 hbirr Exp $
* *
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
@ -1245,12 +1245,12 @@ ScsiClassSendSrbSynchronous(PDEVICE_OBJECT DeviceObject,
{ {
if (WriteToDevice == TRUE) if (WriteToDevice == TRUE)
{ {
RequestType = IOCTL_SCSI_EXECUTE_OUT; RequestType = IOCTL_SCSI_EXECUTE_IN; // needs _in_ to the device
Srb->SrbFlags = SRB_FLAGS_DATA_OUT; Srb->SrbFlags = SRB_FLAGS_DATA_OUT; // needs _out_ from the caller
} }
else else
{ {
RequestType = IOCTL_SCSI_EXECUTE_IN; RequestType = IOCTL_SCSI_EXECUTE_OUT;
Srb->SrbFlags = SRB_FLAGS_DATA_IN; Srb->SrbFlags = SRB_FLAGS_DATA_IN;
} }
} }

View file

@ -12,17 +12,17 @@
#define IOCTL_CONSOLE_FILL_OUTPUT_ATTRIBUTE CTL_CODE(FILE_DEVICE_SCREEN, 0x810, METHOD_BUFFERED, FILE_WRITE_ACCESS) #define IOCTL_CONSOLE_FILL_OUTPUT_ATTRIBUTE CTL_CODE(FILE_DEVICE_SCREEN, 0x810, METHOD_BUFFERED, FILE_WRITE_ACCESS)
#define IOCTL_CONSOLE_READ_OUTPUT_ATTRIBUTE CTL_CODE(FILE_DEVICE_SCREEN, 0x811, METHOD_IN_DIRECT, FILE_ANY_ACCESS) #define IOCTL_CONSOLE_READ_OUTPUT_ATTRIBUTE CTL_CODE(FILE_DEVICE_SCREEN, 0x811, METHOD_OUT_DIRECT, FILE_ANY_ACCESS)
#define IOCTL_CONSOLE_WRITE_OUTPUT_ATTRIBUTE CTL_CODE(FILE_DEVICE_SCREEN, 0x812, METHOD_OUT_DIRECT, FILE_ANY_ACCESS) #define IOCTL_CONSOLE_WRITE_OUTPUT_ATTRIBUTE CTL_CODE(FILE_DEVICE_SCREEN, 0x812, METHOD_IN_DIRECT, FILE_ANY_ACCESS)
#define IOCTL_CONSOLE_SET_TEXT_ATTRIBUTE CTL_CODE(FILE_DEVICE_SCREEN, 0x813, METHOD_BUFFERED, FILE_WRITE_ACCESS) #define IOCTL_CONSOLE_SET_TEXT_ATTRIBUTE CTL_CODE(FILE_DEVICE_SCREEN, 0x813, METHOD_BUFFERED, FILE_WRITE_ACCESS)
#define IOCTL_CONSOLE_FILL_OUTPUT_CHARACTER CTL_CODE(FILE_DEVICE_SCREEN, 0x820, METHOD_BUFFERED, FILE_WRITE_ACCESS) #define IOCTL_CONSOLE_FILL_OUTPUT_CHARACTER CTL_CODE(FILE_DEVICE_SCREEN, 0x820, METHOD_BUFFERED, FILE_WRITE_ACCESS)
#define IOCTL_CONSOLE_READ_OUTPUT_CHARACTER CTL_CODE(FILE_DEVICE_SCREEN, 0x821, METHOD_IN_DIRECT, FILE_ANY_ACCESS) #define IOCTL_CONSOLE_READ_OUTPUT_CHARACTER CTL_CODE(FILE_DEVICE_SCREEN, 0x821, METHOD_OUT_DIRECT, FILE_ANY_ACCESS)
#define IOCTL_CONSOLE_WRITE_OUTPUT_CHARACTER CTL_CODE(FILE_DEVICE_SCREEN, 0x822, METHOD_OUT_DIRECT, FILE_ANY_ACCESS) #define IOCTL_CONSOLE_WRITE_OUTPUT_CHARACTER CTL_CODE(FILE_DEVICE_SCREEN, 0x822, METHOD_IN_DIRECT, FILE_ANY_ACCESS)
#define IOCTL_CONSOLE_DRAW CTL_CODE(FILE_DEVICE_SCREEN, 0x830, METHOD_OUT_DIRECT, FILE_ANY_ACCESS) #define IOCTL_CONSOLE_DRAW CTL_CODE(FILE_DEVICE_SCREEN, 0x830, METHOD_IN_DIRECT, FILE_ANY_ACCESS)
/* TYPEDEFS **************************************************************/ /* TYPEDEFS **************************************************************/

View file

@ -1,4 +1,4 @@
/* $Id: buildirp.c,v 1.30 2002/09/08 10:23:24 chorns Exp $ /* $Id: buildirp.c,v 1.31 2003/03/21 21:09:40 hbirr Exp $
* *
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
@ -260,29 +260,27 @@ IoBuildDeviceIoControlRequest(ULONG IoControlCode,
case METHOD_IN_DIRECT: case METHOD_IN_DIRECT:
DPRINT("Using METHOD_IN_DIRECT!\n"); DPRINT("Using METHOD_IN_DIRECT!\n");
/* build input buffer (control buffer) */ /* build output buffer (control buffer) */
if (InputBuffer && InputBufferLength) if (OutputBuffer && OutputBufferLength)
{ {
Irp->AssociatedIrp.SystemBuffer = (PVOID) Irp->AssociatedIrp.SystemBuffer = (PVOID)
ExAllocatePoolWithTag(NonPagedPool,InputBufferLength, ExAllocatePoolWithTag(NonPagedPool,OutputBufferLength,
TAG_SYS_BUF); TAG_SYS_BUF);
if (Irp->AssociatedIrp.SystemBuffer == NULL) if (Irp->AssociatedIrp.SystemBuffer == NULL)
{ {
IoFreeIrp(Irp); IoFreeIrp(Irp);
return(NULL); return(NULL);
} }
Irp->UserBuffer = OutputBuffer;
RtlCopyMemory(Irp->AssociatedIrp.SystemBuffer,
InputBuffer,
InputBufferLength);
} }
/* build output buffer (data transfer buffer) */ /* build input buffer (data transfer buffer) */
if (OutputBuffer && OutputBufferLength) if (InputBuffer && InputBufferLength)
{ {
Irp->MdlAddress = IoAllocateMdl(OutputBuffer, Irp->MdlAddress = IoAllocateMdl(InputBuffer,
OutputBufferLength, InputBufferLength,
FALSE, FALSE,
FALSE, FALSE,
Irp); Irp);

View file

@ -99,12 +99,21 @@ VOID IoDeviceControlCompletion(PDEVICE_OBJECT DeviceObject,
case METHOD_IN_DIRECT: case METHOD_IN_DIRECT:
DPRINT ("Using METHOD_IN_DIRECT!\n"); DPRINT ("Using METHOD_IN_DIRECT!\n");
/* copy output buffer back and free it */
if (Irp->AssociatedIrp.SystemBuffer)
{
if (IoStack->Parameters.DeviceIoControl.OutputBufferLength)
{
RtlCopyMemory(Irp->UserBuffer,
Irp->AssociatedIrp.SystemBuffer,
IoStack->Parameters.DeviceIoControl.
OutputBufferLength);
}
ExFreePool (Irp->AssociatedIrp.SystemBuffer);
}
/* free input buffer (control buffer) */ /* free input buffer (data transfer buffer) */
if (Irp->AssociatedIrp.SystemBuffer)
ExFreePool (Irp->AssociatedIrp.SystemBuffer);
/* free output buffer (data transfer buffer) */
if (Irp->MdlAddress) if (Irp->MdlAddress)
IoFreeMdl (Irp->MdlAddress); IoFreeMdl (Irp->MdlAddress);
break; break;

View file

@ -1,4 +1,4 @@
/* $Id: conio.c,v 1.45 2003/03/21 20:17:55 hbirr Exp $ /* $Id: conio.c,v 1.46 2003/03/21 21:09:41 hbirr Exp $
* *
* reactos/subsys/csrss/api/conio.c * reactos/subsys/csrss/api/conio.c
* *
@ -984,10 +984,10 @@ VOID Console_Api( DWORD RefreshEvent )
NULL, NULL,
&Iosb, &Iosb,
IOCTL_CONSOLE_WRITE_OUTPUT_CHARACTER, IOCTL_CONSOLE_WRITE_OUTPUT_CHARACTER,
0,
0,
Buffer, Buffer,
sizeof (COORD) + Title.Length); sizeof (COORD) + Title.Length,
NULL,
0);
if( !NT_SUCCESS( Status ) ) if( !NT_SUCCESS( Status ) )
{ {
DPRINT1( "Error writing to console\n" ); DPRINT1( "Error writing to console\n" );
@ -1282,10 +1282,10 @@ CSR_API(CsrWriteConsoleOutputChar)
NULL, NULL,
&Iosb, &Iosb,
IOCTL_CONSOLE_WRITE_OUTPUT_CHARACTER, IOCTL_CONSOLE_WRITE_OUTPUT_CHARACTER,
0,
0,
&Request->Data.WriteConsoleOutputCharRequest.Coord, &Request->Data.WriteConsoleOutputCharRequest.Coord,
sizeof (COORD) + Request->Data.WriteConsoleOutputCharRequest.Length ); sizeof (COORD) + Request->Data.WriteConsoleOutputCharRequest.Length,
NULL,
0);
if( !NT_SUCCESS( Status ) ) if( !NT_SUCCESS( Status ) )
DPRINT1( "Failed to write output chars: %x\n", Status ); DPRINT1( "Failed to write output chars: %x\n", Status );
} }
@ -1476,11 +1476,11 @@ CSR_API(CsrWriteConsoleOutputAttrib)
NULL, NULL,
&Iosb, &Iosb,
IOCTL_CONSOLE_WRITE_OUTPUT_ATTRIBUTE, IOCTL_CONSOLE_WRITE_OUTPUT_ATTRIBUTE,
0,
0,
&Request->Data.WriteConsoleOutputAttribRequest.Coord, &Request->Data.WriteConsoleOutputAttribRequest.Coord,
Request->Data.WriteConsoleOutputAttribRequest.Length + Request->Data.WriteConsoleOutputAttribRequest.Length +
sizeof (COORD) ); sizeof (COORD),
NULL,
0 );
if( !NT_SUCCESS( Status ) ) if( !NT_SUCCESS( Status ) )
DPRINT1( "Failed to write output attributes to console\n" ); DPRINT1( "Failed to write output attributes to console\n" );
} }

View file

@ -346,10 +346,10 @@ WriteConsoleOutputCharacters(LPCSTR lpCharacter,
NULL, NULL,
&IoStatusBlock, &IoStatusBlock,
IOCTL_CONSOLE_WRITE_OUTPUT_CHARACTER, IOCTL_CONSOLE_WRITE_OUTPUT_CHARACTER,
NULL,
0,
Buffer, Buffer,
nLength + sizeof(COORD)); nLength + sizeof(COORD),
NULL,
0);
if (Status == STATUS_PENDING) if (Status == STATUS_PENDING)
{ {
NtWaitForSingleObject(StdOutput, NtWaitForSingleObject(StdOutput,
@ -397,10 +397,10 @@ WriteConsoleOutputCharactersW(LPCWSTR lpCharacter,
NULL, NULL,
&IoStatusBlock, &IoStatusBlock,
IOCTL_CONSOLE_WRITE_OUTPUT_CHARACTER, IOCTL_CONSOLE_WRITE_OUTPUT_CHARACTER,
NULL,
0,
Buffer, Buffer,
nLength + sizeof(COORD)); nLength + sizeof(COORD),
NULL,
0);
if (Status == STATUS_PENDING) if (Status == STATUS_PENDING)
{ {
NtWaitForSingleObject(StdOutput, NtWaitForSingleObject(StdOutput,
@ -444,10 +444,10 @@ WriteConsoleOutputAttributes(CONST USHORT *lpAttribute,
NULL, NULL,
&IoStatusBlock, &IoStatusBlock,
IOCTL_CONSOLE_WRITE_OUTPUT_ATTRIBUTE, IOCTL_CONSOLE_WRITE_OUTPUT_ATTRIBUTE,
NULL,
0,
Buffer, Buffer,
nLength * sizeof(USHORT) + sizeof(COORD)); nLength * sizeof(USHORT) + sizeof(COORD),
NULL,
0);
if (Status == STATUS_PENDING) if (Status == STATUS_PENDING)
{ {
NtWaitForSingleObject(StdOutput, NtWaitForSingleObject(StdOutput,