Con esto se quita de la pila de objetos a un driver. Solo quedaría cerrar cualquier hilo y handel relacionado con el para poder descargarlo con casi total seguridad. 8) 8) 8)
UnAttachDriver proc pDriverObject:PDRIVER_OBJECT
LOCAL CurrentIrql
push esi
push ecx
push edx
push ebx
cli
call KeRaiseIrqlToDpcLevel;Canbio la prioridad para que nada me detenga a medio y se produzca una BSOD
mov CurrentIrql,eax
xor eax,eax
mov ebx,pDriverObject
mov ebx,[ebx+4]
NextDevice:
cmp ebx,eax;Compruebo que tengo una direccion valida de un DeviceObject
je EndDevice
;Posicion actual
;Uno de los DeviceObject a desconectar
mov edx,[ebx+10h]
mov [ebx+10h],eax
mov ecx,[ebx+0B0h]
cmp ecx,eax
je Next
;Posicion actual
;DEVOBJ_EXTENSION del DeviceObject a desconectar
mov esi,[ecx+18h];Consigo la direccion del DeviceObject Inferior de la pila de dispositivos
mov [ecx+18h],eax;EAX = NULL
cmp eax,esi
je Next
;Posicion actual
;DeviceObject inferior
mov [esi+10h],edx;Coloco la direccion del DeviceObject Superior de la pila de dispositivos
cmp eax,edx
je Next
;Posicion actual
;DeviceObject superior
mov ecx,[edx+0B0h];Consigo la direccion de DEVOBJ_EXTENSION del DeviceObject Superior
mov [ecx+18h],esi;Coloco la direccion del DeviceObject Inferior de la pila de dispositivos
DecStackSize:
dec byte ptr[edx+30];Disminullo el contador de la StackSize
mov edx,[edx+10h]
cmp edx,eax
jne DecStackSize
Next:
mov ebx,[ebx+0Ch];Paso al siguiente de la lista
jmp NextDevice
EndDevice:
push CurrentIrql
call KeLowerIrql ;Vuelvo al nivel normal de prioridad
sti
xor eax,eax
pop ebx
pop edx
pop ecx
pop esi
ret
UnAttachDriver endp