|
Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.
Mensajes - seni
Páginas: [1]
1
« en: Lunes 22 de Enero de 2007, 08:58 »
Lo sabia, pero lo he puesto por si alguien que lo lea le sirva.
Por cierto, aprovechando el momento. Como puedo hacer eso mismo en linux, alguno de vosotros lo ha echo.
Cuales son las librerias a utilizar.
Muchas gracias
2
« en: Viernes 19 de Enero de 2007, 18:45 »
Se hace de la siguiente forma.
// abrimos la disquetera como si de un archivo se tratara. hDevice = CreateFile("\\\\.\\A:", GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, NULL, NULL); // en este caso la he abierto solo para escribir, si quieres leer pon un flag más y ya esta, mira en msdn. leer
// preparamos la posición a escribir se utiliza un entero de 64 bits, por lo tanto tengo que convertir __int64 posicion = sector * bytesSector; // bytes por sector suelen ser 512, pero se puede averiguqar con el api. LARGE_INTEGER liNewPos; liNewPos.QuadPart = posicion;
if (hDevice != INVALID_HANDLE_VALUE) { // nos posicionamos if(liNewPos.u.HighPart == 0) dw = SetFilePointer(hDevice, liNewPos.u.LowPart, NULL,FILE_BEGIN); else dw = SetFilePointer(hDevice, liNewPos.u.LowPart, &liNewPos.u.HighPart,FILE_BEGIN); if (dw != INVALID_SET_FILE_POINTER && GetLastError() == NO_ERROR) { b = WriteFile(hDevice, sbuffer0, bytesSector, &dw, NULL); else b = WriteFile(hDevice, sbuffer + (posRand*bytesSector), bytesSector, &dw, NULL); if(b == FALSE || dw != bytesSector) { printf("Error escribiendo en el sector %d", sector); delete sbuffer; delete sbuffer0; CloseHandle(hDevice); return 0; } } else { printf("Error posicionandome en el sector %d", sector); delete sbuffer; delete sbuffer0; CloseHandle(hDevice); return 0; } CloseHandle(hDevice); }
// ya lo tienes
3
« en: Lunes 11 de Septiembre de 2006, 22:56 »
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" };
4
« en: Viernes 8 de Septiembre de 2006, 20:45 »
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.
5
« en: Miércoles 6 de Septiembre de 2006, 21:39 »
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
Páginas: [1]
|
|
|