• Viernes 1 de Noviembre de 2024, 06:28

Autor Tema:  Driver Y Windows Ddk Acceso Al Ri  (Leído 3162 veces)

seni

  • Nuevo Miembro
  • *
  • Mensajes: 5
    • Ver Perfil
Driver Y Windows Ddk Acceso Al Ri
« en: Miércoles 6 de Septiembre de 2006, 21:39 »
0
Hola a todos.

Soy nuevo en el foro, llevo tiempo lellendolo pero esta e la primera vez que me atrevo a escribir.

Prometo participar en las discursiones lo maximo que pueda y mi poco tiempo libre me lo permita.

Estoy haciendo un driver de windows en lenguaje C, pero me da lo mismo en C que en C++. La necesidad del driver es por que quiero acceder al disco a bajo nivel para leer discos que esten rotos.

Tras leer mucho he llegado a la conclusión que la única manera de acceder al disco es mediante un driver del tipo kernel_mode, pues si lo haces del tipo user_mode sólo tienes permisos para utilizar funciones del ring 3.

Me he instalado el Windows DDK y he cogido el ejemplo que trae sioctl. Mi problema es que cuando llamo al driver a una funcion nueva que le he añadido no consigo llamar a otro driver desde este, no se si tengo que llamar a otro driver o hay funciones especificas de acceso a disco para leer.

Mi mallor problema es que para llamar a los métodos que me pueden interesar necesito un device_object, y este se optiene mediante un driver_object, he probado con IoGetDeviceObjectPointer para conseguir la información pero no soy capaz de componer un nombre de objeto valido.

También estoy probando con ZwCreateFile pero me un error que no se por donde cogerlo.

Hay una manera más IoBuildDeviceIoControlRequest pero no se como se utiliza.

Espero que alguien me pueda echar una mano. muchas gracias.

Seni

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Driver Y Windows Ddk Acceso Al Ri
« Respuesta #1 en: Jueves 7 de Septiembre de 2006, 08:25 »
0
Por supuesto que no es facil hacer un driver de modo Kernel para Windows (supongo que estas con NT), especialmente cuando empezas y no conoces muy bien la estructura del Sistema Operativo.

Si lo hicieras en modo Usuario, tal vez haya IOCTLs que te sirvan, harias un programa y no un driver.

Ese ejemplo de driver esta hecho para demostrar los diferentes tipos de I/O que se pueden usar en NT. No se muy bien que codigo estaras agregando ... Para comunicarte con el driver del ejemplo ya tenes el DEVICE_OBJECT que se crea con IoCreateDevice.

Vas por el camino correcto, necesitas un DEVICE_OBJECT, fijate como hace CreateFile para obtener un HANDLE (este es dependiente del objeto FILE_OBJECT y desde el mismo podes llegar al DEVICE_OBJECT). Igual no se si realmente te sera util esto o terminaras usando lo mismo que podrias usar desde modo Usuario.

Ya nos contaras mejor que funciones queres usar exactamente ...

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.

seni

  • Nuevo Miembro
  • *
  • Mensajes: 5
    • Ver Perfil
Re: Driver Y Windows Ddk Acceso Al Ri
« Respuesta #2 en: Viernes 8 de Septiembre de 2006, 20:45 »
0
Relamente estoy echo un lio.

Me imagino que con el deviceobject que creo en la inicialización de mi driver no puedo llamar a otros devices. igual me pasará con mi driverobject.

No se como obtener el fileobject de otro objeto, es decir no se si existe una función equivalente al createioobject del modo usuario en el modo kernel.

Estoy probando en modo usuario a leer directamente de "\\\\.\\PHYSICALDRIVE0" pero esto no se si me funcionaría si no esta montado, es decir si tengo un disco duro no reconocido por windows por ejemplo con ext2 de linux, no se si podria leer en modo raw o algo parecido, por eso quería utilizar las funciones de la bios como la int13.

muchas gracias por contestarme.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Driver Y Windows Ddk Acceso Al Ri
« Respuesta #3 en: Viernes 8 de Septiembre de 2006, 21:36 »
0
Cita de: "seni"
Me imagino que con el deviceobject que creo en la inicialización de mi driver no puedo llamar a otros devices. igual me pasará con mi driverobject.


Obviamente no, ese es para que te llamen a vos.

Cita de: "seni"
No se como obtener el fileobject de otro objeto, es decir no se si existe una función equivalente al createioobject del modo usuario en el modo kernel.

Podes obtener un objecto apartir de un HANDLE con ObReferenceObjectByHandle, pero no creo que necesites hacer eso.

Cita de: "seni"
Estoy probando en modo usuario a leer directamente de "\\\\.\\PHYSICALDRIVE0" pero esto no se si me funcionaría si no esta montado, es decir si tengo un disco duro no reconocido por windows por ejemplo con ext2 de linux, no se si podria leer en modo raw o algo parecido, por eso quería utilizar las funciones de la bios como la int13.

No soy un experto en el File System pero que yo sepa lo que no te funcionaria serian los VOLUMENES (lease E:, F:), que si tienen que estar reconocidos por Windows mientras que los discos son eso, discos y punto, no importa si no estan formateados. Abriendo el physicaldrive estas leyendo en modo raw puramente, lees sector por sector, incluso cuando abris con \\C:\ lo estas haciendo y podes generar un ISO del disco perfectamente, da exactamente lo mismo que tipo de particion sea ya que la podes leer y escribir.

Extracto de la MSDN, funcion CreateFile:
You can use the CreateFile function to open a physical disk drive or a volume. The function returns a handle that can be used with the DeviceIoControl function. This enables you to access the disk partition table. However, it is potentially dangerous to do so, because an incorrect write to a disk could make its contents inaccessible

Asi que mucho cuidado con escribir eh, jodes la particion en 30''. En cuanto a la BIOS olvidala, a lo sumo podrias recurrir a in's y out's.

Cita de: "seni"
muchas gracias por contestarme.

De nadas, para eso estamos. Probablemente en tu caso no sea necesario ni como hacer un driver y sea mejor que sigas con el camino del physicaldrive.

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.

seni

  • Nuevo Miembro
  • *
  • Mensajes: 5
    • Ver Perfil
Re: Driver Y Windows Ddk Acceso Al Ri
« Respuesta #4 en: Lunes 11 de Septiembre de 2006, 22:56 »
0
Al final estoy trabajando directamente con el PHYSICALDRIVE, ya leo el MBR perfectament y lo interpreto, me he creado una estructura para manejarla, el siguiente paso es reconocer bien las FAT, eso ya te lo comentare en la siguiente entrega.

Por si le sirve a alguien os pongo mi estructura de MBR, la he hecho distinta a la del GLUB y la malloria que he visto por ahi. Sólo tengo un problema que no he sabido solicionarlo, es en las dos últimas variables donde se indica el sector de inicio LBA y el de total sectores, si ponçia un unsigned int me descuadraba la structura y no me leia bien los bytes, se desplazaba dos bytes. Probe con DWORD y unsigned long, me pasaba lo mismo. Al final he echo una chapuza, lo he dejado con BYTE sectorInicio[4], despues pongo un puntero tipo unsigned int apuntado a estos datos.

Tambiçen os incluyo los defines que he ido componiendo.

typedef struct _PARTICION {
   BYTE Arrancable; // Marca de arranque si el bit 7 está activo es una partición de arranque, los otros 6 bits deben ser ceros. valor = 64 es arrancable
   BYTE IniPista; // track de inicio
   BYTE IniSector; // Sector de inicio
   BYTE IniCilindro; // Cilindro de inicio
   BYTE Tipo; // Tipo de particion
   BYTE FinPista; // track de fin
   BYTE FinSector; // Sector de fin
   BYTE FinCilindro; // Cilindro de fin
   BYTE relsect[4];   // Primer sector relativo al inicio del disco
   BYTE NumSectores[4]; // Numero de sectores del disco
} PARTICION, *PPARTICION;

typedef union _MBR {
   struct {
      BYTE gestorDeArranque[446]; // Código máquina (gestor de arranque)
      PARTICION Particion1; // Tabla de particiones particion 1
      PARTICION Particion2; // Tabla de particiones particion 2
      PARTICION Particion3; // Tabla de particiones particion 3
      PARTICION Particion4; // Tabla de particiones particion 4
      BYTE marcaFinal[2]; // Firma de unidad arrancable ("055AAh" en hexadecimal)
   } data;
   BYTE rawdata[512];
} MBR, *PMBR;

#define VACIA 00 // Partición vacía
#define FAT12 01 // Partición FAT12
#define XENIX_PRINCIPAL 02 // XENIX (principal)
#define XENIX_USUARIO 03 // XENIX (usuario)
#define FAT16 04 // FAT16 (hasta 32 Mb)
#define EXTENDED_DOS_33 05 // Partición extendida DOS 3.3+
#define FAT16X 06 // FAT16 (más de 32 Mb)
#define HPFS 07 // HPFS IFS
#define NTFS 07 // NTFS
#define ADVANCED_UNIX 07 // Advanced Unix
#define QNX_2 07 // QNX 2.x
#define SPLITDRIVE 08 // SplitDrive
#define COMODORE_DOS 08 // Commodore DOS
#define DELL 08 // DELL
#define QNX_1 08 // QNX 1.x
#define AIX_DATA 09 // AIX (partición de datos)
#define COHERENT 09 // Coherent
#define QNX_1_Y_2 09 // QNX 1.x y 2.x (qnz)
#define OS2_ARRANQUE 10 // Gestor de arranque de OS/2
#define COHERENT_INTERCAMBIO 10 // Coherent (intercambio)
#define OPUS 10 // OPUS
#define FAT32_W95OSR2 11 // FAT32 Windows95 OSR2
#define FAT32_LBA 12 // FAT32 LBA
#define FAT16_LBA 13 // FAT16 LBA
#define XINT13 14 // XINT13
#define EXTENDED_LBA 15 // Partición extendida LBA de Windows95
#define DESCONOCIDA 16 // ???
#define FAT12_OCULTA 17 // FAT12 Oculta
#define FAT_LOGICA_DOS_3 17 // FAT Lógica DOS 3.x
#define DIAGNOSTICO_CONFIGURACION 18 // Partición de diagnóstico y configuración
#define FAT16_OCULTA 20 // FAT16 Oculta menor de 32 megabytes
#define AST_DOS 20 // AST DOS
#define FAT16_OCULTAX 22 // FAT16 Oculta mayor de 32 megabytes
#define IFS_OCULTA 23 // IFS oculta
#define AST_SMARTSLEEP 24 // AST SmartSleep
#define SIN_USO 25 // Sin uso
#define FAT32_W95OSR2_OCULTA 27 // Windows95 OSR2 FAT32 Oculta
#define FAT32_W95OSR2_LBA_OCULTA 28 // Windows95 OSR2 FAT32 LBA oculta
#define FAT_W95OSR2_LBA_OCULTA 30 // Windows95 OSR2 FAT LBA oculta
#define SIN_USO2 32 // Sin uso
#define RESERVADA1 33 // Reservada
#define SIN_USO3 34 // Sin uso
#define RESERVADA2 35 // Reservada
#define NEC_DOS_3 36 // NEC DOS 3.x
#define RESERVADA3 38 // Reservado
#define AFS_ATHEOS 42 // AtheOS (AFS)
#define SYLLABLESECURE 43 // SyllableSecure (SylStor)
#define RESERVADA4 49 // Reservado
#define NOS 50 // NOS
#define RESERVADA5 51 // Reservado
#define RESERVADA6 52 // Reservado
#define JFS 53 // JFS
#define RESERVADA7 54 // Reservado
#define THEOS_3 56 // TheOS v 3.3 de 2 Gb
#define PLAN9 57 // Plan9
#define THEOS_4_SPAN 57 // TheOS v 4 span
#define THEOS_4 58 // TheOS v 4 4Gb
#define THEOS_4_EXTENDED 59 // TheOS v 4 partición extendida
#define PREP 65 // PREP
#define LDM 66 // LDM Microsoft Dynamic Disc partitioning scheme
#define FAT_HIDDEN_16MB_68 68  // FAT, hidden from MS/PC-DOS version 2.x and earlier because it may be larger than 16MiB or extend/be located outside of the first 16MiB of the disc
#define FAT_HIDDEN_32MB_70 70 // FAT, hidden from MS/PC-DOS versions 3.2 and earlier because it may be larger than 32MiB or extend/be located outside of the first 32MiB of the disc
#define MSDOS_DOSWIN_HIDDEN_71 71 // Probe the volume's boot block for a BPB in order to tell. Hidden from MS/PC-DOS and DOS-Windows because it may not be FAT at all.
#define FAT32_W95OSR2_OCULTA_75 75 // FAT, hidden from MS/PC-DOS versions 6.22 and earlier and DOS-Windows prior to version 95OSR2 because it may be larger than 2GiB or extend/be located beyond the 1024th cylinder of the disc
#define FAT32_W95OSR2_OCULTA_LBA_78 78 // FAT, hidden from MS/PC-DOS version 6.22 and earlier and DOS-Windows prior to version 95OSR2 because it may extend/be located beyond the 1024th cylinder of the disc
#define FAT_81 81 // FAT
#define FAT_HIDDEN_16MB_84 84  // FAT, hidden from MS/PC-DOS version 2.x and earlier because it may be larger than 16MiB or extend/be located outside of the first 16MiB of the disc
#define FAT_HIDDEN_32MB_86 86 // FAT, hidden from MS/PC-DOS versions 3.2 and earlier because it may be larger than 32MiB or extend/be located outside of the first 32MiB of the disc
#define MSDOS_DOSWIN_HIDDEN_87 87 // Probe the volume's boot block for a BPB in order to tell. Hidden from MS/PC-DOS and DOS-Windows because it may not be FAT at all.
#define FAT32_W95OSR2_OCULTA_91 91 // FAT, hidden from MS/PC-DOS versions 6.22 and earlier and DOS-Windows prior to version 95OSR2 because it may be larger than 2GiB or extend/be located beyond the 1024th cylinder of the disc
#define FAT32_W95OSR2_OCULTA_LBA_94 94 // FAT, hidden from MS/PC-DOS version 6.22 and earlier and DOS-Windows prior to version 95OSR2 because it may extend/be located beyond the 1024th cylinder of the disc
#define UNIX 99 // Unix
#define NTFT 128 // NTFT
#define FAT_129 129 // FAT
#define EXT2_EXT3 130 // Linux Ext2 o Ext3
#define SWAP_LINUX 131 // Linux swap
#define FAT_HIDDEN_16MB_132 132  // FAT, hidden from MS/PC-DOS version 2.x and earlier because it may be larger than 16MiB or extend/be located outside of the first 16MiB of the disc
#define SECOND_MBR_SCH 133 // Secondary MBR partitioning scheme, hidden from MS/PC-DOS, DOS-Windows, Windows NT, and OS/2, because it is intended to contain partitions that are to be available only to Linux.
#define FAT_HIDDEN_32MB_134 134 // FAT, hidden from MS/PC-DOS versions 3.2 and earlier because it may be larger than 32MiB or extend/be located outside of the first 32MiB of the disc
#define MSDOS_DOSWIN_HIDDEN_135 135 // Probe the volume's boot block for a BPB in order to tell. Hidden from MS/PC-DOS and DOS-Windows because it may not be FAT at all.
#define FAT32_W95OSR2_OCULTA_139 139 // FAT, hidden from MS/PC-DOS versions 6.22 and earlier and DOS-Windows prior to version 95OSR2 because it may be larger than 2GiB or extend/be located beyond the 1024th cylinder of the disc
#define FAT32_W95OSR2_OCULTA_LBA_142 142 // FAT, hidden from MS/PC-DOS version 6.22 and earlier and DOS-Windows prior to version 95OSR2 because it may extend/be located beyond the 1024th cylinder of the disc
#define FAT_145 145 // FAT
#define FAT_HIDDEN_16MB_148 148  // FAT, hidden from MS/PC-DOS version 2.x and earlier because it may be larger than 16MiB or extend/be located outside of the first 16MiB of the disc
#define FAT_HIDDEN_32MB_150 150 // FAT, hidden from MS/PC-DOS versions 3.2 and earlier because it may be larger than 32MiB or extend/be located outside of the first 32MiB of the disc
#define MSDOS_DOSWIN_HIDDEN_151 151 // Probe the volume's boot block for a BPB in order to tell. Hidden from MS/PC-DOS and DOS-Windows because it may not be FAT at all.
#define FAT32_W95OSR2_OCULTA_155 155 // FAT, hidden from MS/PC-DOS versions 6.22 and earlier and DOS-Windows prior to version 95OSR2 because it may be larger than 2GiB or extend/be located beyond the 1024th cylinder of the disc
#define FAT32_W95OSR2_OCULTA_LBA_158 158 // FAT, hidden from MS/PC-DOS version 6.22 and earlier and DOS-Windows prior to version 95OSR2 because it may extend/be located beyond the 1024th cylinder of the disc
#define FREEBSD 165 // Old FreeBSD partitioning scheme (FreeBSD has since switched to EFI partitioning.)
#define NETBSD 166 // Old NetBSD partitioning scheme (NetBSD has since switched to EFI partitioning.)
#define OPENBSD 169 // Old OpenBSD partitioning scheme (OpenBSD has since switched to EFI partitioning.)
#define NTFT_VALID 192 // NTFT
#define FAT_193 193 // FAT
#define FAT_HIDDEN_16MB_196 196  // FAT, hidden from MS/PC-DOS version 2.x and earlier because it may be larger than 16MiB or extend/be located outside of the first 16MiB of the disc
#define FAT_HIDDEN_32MB_198 198 // FAT, hidden from MS/PC-DOS versions 3.2 and earlier because it may be larger than 32MiB or extend/be located outside of the first 32MiB of the disc
#define MSDOS_DOSWIN_HIDDEN_199 199 // Probe the volume's boot block for a BPB in order to tell. Hidden from MS/PC-DOS and DOS-Windows because it may not be FAT at all.
#define FAT32_W95OSR2_OCULTA_203 203 // FAT, hidden from MS/PC-DOS versions 6.22 and earlier and DOS-Windows prior to version 95OSR2 because it may be larger than 2GiB or extend/be located beyond the 1024th cylinder of the disc
#define FAT32_W95OSR2_OCULTA_LBA_206 206 // FAT, hidden from MS/PC-DOS version 6.22 and earlier and DOS-Windows prior to version 95OSR2 because it may extend/be located beyond the 1024th cylinder of the disc
#define FAT_209 209 // FAT
#define FAT_HIDDEN_16MB_212 212  // FAT, hidden from MS/PC-DOS version 2.x and earlier because it may be larger than 16MiB or extend/be located outside of the first 16MiB of the disc
#define FAT_HIDDEN_32MB_214 214 // FAT, hidden from MS/PC-DOS versions 3.2 and earlier because it may be larger than 32MiB or extend/be located outside of the first 32MiB of the disc
#define MSDOS_DOSWIN_HIDDEN_215 215 // Probe the volume's boot block for a BPB in order to tell. Hidden from MS/PC-DOS and DOS-Windows because it may not be FAT at all.
#define FAT32_W95OSR2_OCULTA_219 219 // FAT, hidden from MS/PC-DOS versions 6.22 and earlier and DOS-Windows prior to version 95OSR2 because it may be larger than 2GiB or extend/be located beyond the 1024th cylinder of the disc
#define FAT32_W95OSR2_OCULTA_LBA_222 222 // FAT, hidden from MS/PC-DOS version 6.22 and earlier and DOS-Windows prior to version 95OSR2 because it may extend/be located beyond the 1024th cylinder of the disc
#define EFI 238 // EFI partitioning scheme

const char PartitionTypeName[58][60] = {
    "Partición vacía",
    "Partición FAT12",
    "XENIX (principal)",
    "XENIX (usuario)",
    "FAT16 (hasta 32 Mb)",
    "Partición extendida DOS 3.3+",
    "FAT16 (más de 32 Mb)",
    "NTFS/HPFS/Advanced Unix/QNX 2.x",
    "SplitDrive/Commodore DOS/DELL/QNX 1.x",
    "AIX (partición de datos)/Coherent/QNX 1.x y 2.x (qnz)",
    "Gestor de arranque de OS/2/Coherent (intercambio)/OPUS",
    "FAT32 Windows95 OSR2",
    "FAT32 LBA",
    "FAT16 LBA",
   "XINT13",
    "Partición extendida LBA de Windows95",
    "???",
    "FAT12 Oculta/FAT Lógica DOS 3.x",
    "Partición de diagnóstico y configuración",
    "FAT16 Oculta menor de 32 megabytes/AST DOS",
   "AST DOS",
    "FAT16 Oculta mayor de 32 megabytes",
    "IFS oculta",
    "AST SmartSleep",
    "Sin uso",
    "Windows95 OSR2 FAT32 Oculta",
    "Windows95 OSR2 FAT32 LBA oculta",
    "Windows95 OSR2 FAT LBA oculta",
    "???",
    "Sin uso",
    "Reservada",
    "Sin uso",
    "Reservada",
    "NEC DOS 3.x",
    "???",
    "Reservado",
    "???",
    "???",
    "???",
    "AtheOS (AFS)",
    "SyllableSecure (SylStor)",
    "???",
    "???",
    "???",
    "???",
    "???",
    "Reservado",
    "NOS",
    "Reservado",
    "Reservado",
    "JFS",
    "Reservado",
    "???",
    "TheOS v 3.3 de 2 Gb",
    "Plan9/TheOS v 4 span",
    "TheOS v 4 4Gb",
    "TheOS v 4 partición extendida"
};