Estoy tratando de solucionar el arranque lento de un archivo binario de terceros (sin fuente). Es una aplicación de 32 bits que se ejecuta en Windows 7 de 64 bits.Reventado de la creación de HANDLE en WOW64
He utilizado un depurador para entrar en la aplicación mientras está colgado con un 0% de uso de la CPU durante el inicio, y parece estar esperando ReadFile
para regreso. El primer argumento para ReadFile
es el valor del controlador, 000000f0. la orden de windbg !handle
me dice:
Handle f0 Type File Attributes 0 GrantedAccess 0x120189: ReadControl,Synch Read/List,ReadEA,ReadAttr,WriteAttr HandleCount 2 PointerCount 4 No Object Specific Information available
Quiero saber qué dispositivo esto corresponde a. Pero Sysinternals Process Explorer no incluye este identificador en su lista de identificadores de proceso.
He utilizado windbg para rastrear todas las llamadas a ntdll!NtCreateFile
e imprimí la ruta y el identificador devuelto: este identificador no se encuentra entre ellos. Los puntos de interrupción en kernel32!CreateNamedPipeW
, kernel32!CallNamedPipeW
y kernel32!WaitNamedPipeW
nunca se disparan (lo cual es extraño porque Process Explorer sí mostró otro identificador con la ruta \Device\NamedPipe\
).
Para referencia, aquí es el comando de rastrear NtCreateFile
(akak ZwCreateFile
) en Windows x64:
bp ntdll!NtCreateFile "!ustr poi(@r8+10) ; r $t0 = @rcx ; gu ; dd @$t0 L1 ; gc"
Thanks to Skywing for pointing me in the right direction on that.
¿De dónde más puede venir una MANIJA de tipo File
? ¿Las otras funciones de creación de HANDLE no se delegan en NtCreateFile
para el syscall real (supongo que no)?
¿Ha considerado también el monitor de proceso para supervisar el inicio? Una segunda opción sería livekd para examinar el lado kernel de windbg. – deemok
@deemok: Sí, y por lo que yo sé, procmon ni siquiera ve la llamada 'ReadFile' que está expirando. Creo que podría ejecutar un depurador de núcleo, con una VM no sería tan malo, pero he estado tratando de evitar eso. Toda la información necesaria debe estar disponible en el modo de usuario, en el momento en que se realiza la llamada a cualquier API que cree el MANGO. –
No sé si 'NtCreateFile' es la única rutina de sistema invocada para obtener un' HANDLE'. Pero creo que debería haber una manera de descubrir las propiedades 'HANDLE' sin embargo. Dentro del proceso específico, el 'HANDLE' debe corresponder al' FILE_OBJECT' subyacente (si es un manejador de archivo, por supuesto). Puede usar 'ObReferenceObjectByHandle', verificar que sea un identificador de archivo (verificar' ObjectType') y luego convertir los datos del objeto a 'FILE_OBJECT'.Contiene, entre otras cosas, un puntero a 'DEVICE_OBJECT', que contiene un puntero a' DRIVER_OBJECT'. Entonces, todo teóricamente se puede descubrir – valdo