Al sacar la dirección de ZwOpenFile desde el disco y al listar la SSDT con el IceSword, las direcciones son las mismas, así que en teoría si lo tendría que llamar.
Rapida comprobacion de que eso no es correcto:
0: kd> u nt!zwopenfile
nt!ZwOpenFile:
8082963c b874000000 mov eax,74h
80829641 8d542404 lea edx,[esp+4]
80829645 9c pushfd
80829646 6a08 push 8
80829648 e8040e0400 call nt!KiSystemService (8086a451)
8082964d c21800 ret 18h
0: kd> u nt!ntopenfile
nt!NtOpenFile:
808a3182 8bff mov edi,edi
808a3184 55 push ebp
808a3185 8bec mov ebp,esp
808a3187 33c0 xor eax,eax
808a3189 50 push eax
808a318a 50 push eax
808a318b 50 push eax
808a318c 50 push eax
0: kd> dd keservicedescriptortable
80885700 8082d450 00000000 0000011c 8082d8c4
80885710 00000000 00000000 00000000 00000000
80885720 00000000 00000000 00000000 00000000
80885730 00000000 00000000 00000000 00000000
80885740 00000002 00002710 bf80c0b6 00000000
80885750 baa78a80 f7335b60 862f064c 80a1f0c0
80885760 00000000 00000000 a16a2aa3 00000000
80885770 1c7164e3 01c99733 00000000 00000000
0: kd> dd 8082d450+0x74*4
8082d620
808a3182 808a1b3a 808fe748 8094db58
8082d630 8093fe2a 8091d41a 808f43fc 80916722
8082d640 80916386 808d33d2 8093d7fc 808ecb9c
8082d650 808f4688 80916740 809164f6 8093f744
8082d660 8096e14a 808f24ae 80920ae4 8091c72c
8082d670 8091c918 808e13da 809377ba 8089fed6
8082d680 8093f0e4 8093f0e4 80868bb6 809393ac
8082d690 8093a00c 808a2e64 808e760e 808a31b2
Como se puede observar en la SSDT, el servicio 0x74 que corresponde a OpenFile apunta a NtOpenFile.
El problema esta en que el código no funciona si las direcciones son enviadas desde modo usuario, si no hay conexión entre modo usuario y kernel si funciona
Esta explicado en el articulo que deje: en tu IOCTL el Previous Mode es User (1), entonces la funcion que estas llamando NtOpenFile procedera a comprobar los parametros que en este caso son de modo Kernel con lo cual dara una excepcion (controlada) y retornara el error correspondiente (comproba el eax que devuelve). Desde el driver entry tu Previous Mode es Kernel (0) entonces los parametros no se comprueban, se confia en los modulos de modo Kernel.
Tenes que usar la correcta ZwOpenFile asi el Previous Mode es el adecuado, ZwOpenFile termina llamando a NtOpenFile despues de, entre otras cosas, poner el Previous Mode a Kernel (0).