• Jueves 28 de Marzo de 2024, 12:03

Autor Tema:  Problemas "extraños" Con Ioctls  (Leído 2778 veces)

Zirrosis

  • Miembro activo
  • **
  • Mensajes: 97
    • Ver Perfil
Problemas "extraños" Con Ioctls
« en: Lunes 4 de Febrero de 2008, 15:58 »
0
Tengo ciertos problemas "curiosos" al pasar datos desde Ring3 a Ring0, e conseguido pasar datos desde una aplicación en Ring3 a Ring0, pero al terminar los datos se me "adieren" ciertos caracteres indeseados. Antes se me añadian caracteres del tipo ]º'... ahora veo que solamente se me añade una n, en fin, esto es lo que me da el DebugView:

Citar
00000000   0.00000000   Cargado   
00000001   3.99884796   Llamada a CreateFile o CloseHandle   
00000002   3.99886322   Buffer: Hola a todosn   
00000003   3.99886751   Longitud: 12   
00000004   3.99887896   Llamada a CreateFile o CloseHandle   
00000005   8.11681557   Saliendo

Y aqui el codigo de la aplicación en Ring3:

Código: Text
  1. #include <windows.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4.  
  5.  
  6. int main(int argc, char* argv[])
  7. {
  8.   DWORD r;
  9.   HANDLE h;
  10.   char s[13] = "Hola a todos";
  11.  
  12.   printf("Comunicación con driver by Hendrix\n\n");
  13.  
  14.   h=CreateFile("\\\\.\\driver2", GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ, NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
  15.   DeviceIoControl(h, 0x11111111, s,strlen(s), NULL, 0,&r, NULL);
  16.   CloseHandle(h);
  17.  
  18.   return 0;
  19. }
  20.  

Y aqui la funcion que recibe los datos en Ring0:

Código: Text
  1. NTSTATUS Recibir(PDEVICE_OBJECT DeviceObject,PIRP Irp)
  2. {
  3.     NTSTATUS            s=STATUS_SUCCESS;
  4.     PIO_STACK_LOCATION  Stack;
  5.   PVOID              inputBuffer;
  6.   ULONG              inputBufferLength;
  7.   ULONG              ioControlCode;
  8.   ANSI_STRING        strf;
  9.  
  10.  
  11.     Stack=IoGetCurrentIrpStackLocation(Irp);
  12.   __try
  13.     {
  14.     inputBuffer = Irp->AssociatedIrp.SystemBuffer;
  15.     inputBufferLength = Stack->Parameters.DeviceIoControl.InputBufferLength;
  16.     ioControlCode = Stack->Parameters.DeviceIoControl.IoControlCode;
  17.  
  18.     DbgPrint("Buffer: %s", inputBuffer);
  19.     DbgPrint("Longitud: %d", inputBufferLength);
  20.   }
  21.  
  22.   __except(EXCEPTION_EXECUTE_HANDLER)
  23.    {
  24.     DbgPrint("Exception");
  25.   }
  26.     Irp->IoStatus.Status = STATUS_SUCCESS;
  27.     Irp->IoStatus.Information = 0;
  28.     IoCompleteRequest(Irp, IO_NO_INCREMENT);
  29.     return s;    
  30. }
  31.  

Alguien sabe poque se me adieren caracteres????

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Problemas "extraños" Con Ioctls
« Respuesta #1 en: Lunes 4 de Febrero de 2008, 18:51 »
0
¿Que devuelve la funcion strlen? El tamaño de una cadena, es decir la cantidad de caracteres que contiene, sin incluir el terminador de cadena (0).

strlen(s) no es correcto, asumo que estas usando buffered I/O - por Irp->AssociatedIrp.SystemBuffer - y el sistema reservara strlen(s) y copiara strlen(s) bytes a ese buffer, siendo lo siguiente basura. Consulta la documentacion al respecto.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

Zirrosis

  • Miembro activo
  • **
  • Mensajes: 97
    • Ver Perfil
Re: Problemas "extraños" Con Ioctls
« Respuesta #2 en: Martes 5 de Febrero de 2008, 00:05 »
0
Nop, llegue a la misma conclusion que tu, asi que puse esto:

strlen(s) -1 y el resultado fue el siguiente, en lugar de

Hola a todos (+ caracteres)

Era:

Hola a todo (+ caracteres)

Asi que supongo que eso es correcto, tambien probe de declarar

char s[13] = "Hola a todos";

Asi:

char s[13] = "Hola a todos\0";

Y tampoco dio resultado... :unsure:

La verdad es que es muy raro  :wacko:

Un Saludo y gracias otra vez Eternal  :)

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Problemas "extraños" Con Ioctls
« Respuesta #3 en: Martes 5 de Febrero de 2008, 08:08 »
0
Cita de: "Zirrosis"
Nop

No entendiste.

Supongamos que tenes la cadena HOLA. strlen devuelve 4, si pasas al I/O manager 3 (strlen - 1) lo que hace es reservar 3 bytes y copiar HOL, lo siguiente es basura. Si pasas 4 (strlen) reserva 4 bytes y copia HOLA, lo siguiente es baura. Tenes que pasarle 5 (strlen + 1) asi reservara 5 bytes copiara tanto HOLA como el terminador (0).

Cita de: "Zirrosis"
char s[13] = "Hola a todos\0";

Eso es redundante, al ser una cadena el compilador pone el terminador automaticamente.

Cita de: "Zirrosis"
La verdad es que es muy raro  :wacko:

Es un problema muy simple  :P

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

Zirrosis

  • Miembro activo
  • **
  • Mensajes: 97
    • Ver Perfil
Re: Problemas "extraños" Con Ioctls
« Respuesta #4 en: Martes 5 de Febrero de 2008, 12:13 »
0
Muy cierto, ahora si me funciona  :lol:

Como siempre, gracias Eternal  :)

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Problemas "extraños" Con Ioctls
« Respuesta #5 en: Martes 5 de Febrero de 2008, 13:17 »
0
De nadas  B)

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

Zirrosis

  • Miembro activo
  • **
  • Mensajes: 97
    • Ver Perfil
Re: Problemas "extraños" Con Ioctls
« Respuesta #6 en: Miércoles 6 de Febrero de 2008, 23:35 »
0
Aprovecho este post para solucionar un segundo problema....el caso es que desde la aplicación en Ring3 paso la ruta de un archivo al cual quiero impedir el acceso, si tengo la ruta "harcodeada" en el Driver me funciona perfectamente, el problema lo tengo a la hora de comparar el archivo que se paso desde Ring3. Antes tenia lo siguiente (con la dirección harcodeada:

Código: Text
  1. #define archivo L"\\??\\C:\archivo.txt"
  2.  
  3. ...
  4. ..
  5. ..
  6.  
  7.  
  8. RtlInitUnicodeString(&uIni,archivo);
  9. if (RtlCompareUnicodeString(&uIni,ObjectAttributes->ObjectName,TRUE)==0)
  10. {
  11.   if (DesiredAccess & DELETE)
  12. {
  13.  

Con este codigo me funcionaba perfectamente, como ven, e harcodeado la ruta del archivo arriba del todo, el problema viene cuando lo paso desde Ring3, le paso lo siguiente:

c:\archivo.txt

Y luego hago esto:

Código: Text
  1. RtlInitUnicodeString(&uIni,archivo);
  2. RtlAnsiStringToUnicodeString(&uIni,archivo,TRUE);
  3. if (RtlCompareUnicodeString(&uIni,ObjectAttributes->ObjectName,TRUE)==0)
  4. {
  5.   if (DesiredAccess & DELETE)
  6. {
  7.  

Evidentemente no me funciona, mi pregunta es, tengo que agregar el \\??\\ delante al pasarlo desde la Ring3???

Ahora mismo tengo declarado el archivo como PVOID, me imagino que no influye esto.

Un Saludo.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Problemas "extraños" Con Ioctls
« Respuesta #7 en: Jueves 7 de Febrero de 2008, 00:19 »
0
Tanto esta como la anterior son dudas basicas, tenes que leer la documentacion y comprender como funcionan Windows y C/C++. Tus programas son de modo Usuario y tus drivers (modulos de modo Kernel) de modo Kernel (los anillos pueden variar de una plataforma a otra).

En el segundo caso no tiene ningun sentido llamar a RtlInitUnicodeString - es redundante ya que RtlAnsiStringToUnicodeString reservara memoria y la asignara a al campo Buffer - y es un error conceptual si tu cadena es ANSI (deberias usar Unicode siempre).

Directo del WDK (ex DDK):
Using Files In A Driver
The Microsoft Windows executive represents files by file objects, which are executive objects that are managed by the object manager. (Directories are also represented by file objects.)

Kernel-mode components refer to a file by its object name, which is \DosDevices concatenated to the file's full path. (On Microsoft Windows 2000 and later versions of the operating system, \?? is equivalent to \DosDevices.) For example, the object name of the C:\WINDOWS\example.txt file is \DosDevices\C:\WINDOWS\example.txt. You use the object name to open a handle to a file. For more information about object names, see Object Names.

http://msdn2.microsoft.com/en-us/library/aa489615.aspx

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

Zirrosis

  • Miembro activo
  • **
  • Mensajes: 97
    • Ver Perfil
Re: Problemas "extraños" Con Ioctls
« Respuesta #8 en: Jueves 7 de Febrero de 2008, 00:23 »
0
es decir, que si es necesario el \\??\\.

Mañana lo pruebo, por hoy me voy a la cama.

Gracias de nuevo Eternal  ;)