一段程序开始如下
........................
typedef DWORD (__stdcall *PFNNTQUERYSYSTEMINFORMATION)  (DWORD, PVOID, DWORD, PDWORD);
typedef PVOID (__stdcall *PFNRTLCREATEQUERYDEBUGBUFFER) (DWORD, DWORD);
typedef DWORD (__stdcall *PFNRTLQUERYPROCESSDEBUGINFORMATION) (DWORD, DWORD, PVOID);
typedef void (__stdcall *PFNRTLDESTROYQUERYDEBUGBUFFER) (PVOID);
typedef void (__stdcall *PFNTRTLRUNDECODEUNICODESTRING)  (BYTE, PUNICODE_STRING);PFNNTQUERYSYSTEMINFORMATION pfnNtQuerySystemInformation;
PFNRTLCREATEQUERYDEBUGBUFFER pfnRtlCreateQueryDebugBuffer;
PFNRTLQUERYPROCESSDEBUGINFORMATION pfnRtlQueryProcessDebugInformation;
PFNRTLDESTROYQUERYDEBUGBUFFER pfnRtlDestroyQueryDebugBuffer;
PFNTRTLRUNDECODEUNICODESTRING pfnRtlRunDecodeUnicodeString;
............................ _asm
   {
   mov AL,10
   mov DL,70
//    out al,dl
//    mov dx,71
//    in  high,dx
   }
HINSTANCE hNtDll = LoadLibrary("NTDLL.DLL");
pfnNtQuerySystemInformation =(PFNNTQUERYSYSTEMINFORMATION) GetProcAddress 
(hNtDll, 
"NtQuerySystemInformation");
pfnRtlCreateQueryDebugBuffer =(PFNRTLCREATEQUERYDEBUGBUFFER)GetProcAddress( hNtDll,"RtlCreateQueryDebugBuffer");pfnRtlQueryProcessDebugInformation = (PFNRTLQUERYPROCESSDEBUGINFORMATION) GetProcAddress(hNtDll,"RtlQueryProcessDebugInformation");pfnRtlDestroyQueryDebugBuffer =(PFNRTLDESTROYQUERYDEBUGBUFFER) GetProcAddress(hNtDll,"RtlDestroyQueryDebugBuffer");

pfnRtlRunDecodeUnicodeString =(PFNTRTLRUNDECODEUNICODESTRING) GetProcAddress (hNtDll,"RtlRunDecodeUnicodeString");
.......................................................
这段程序
1.typedef DWORD (__stdcall *PFNNTQUERYSYSTEMINFORMATION)  (DWORD, PVOID, DWORD, PDWORD);
.....................................................
typedef void (__stdcall *PFNRTLDESTROYQUERYDEBUGBUFFER) (PVOID);
向程序这样定义有什么作用啊
2.程序中间有段汇编起什么作用啊!
3.NTDLL.DLL这个动态库有什么作用啊!
4.pfnNtQuerySystemInformation =(PFNNTQUERYSYSTEMINFORMATION) GetProcAddress(hNtDll,"NtQuerySystemInformation");
后面连续几句这种语句又有什么作用啊!我不太明白啊!
一连串这么多问题只有这么点分真的不好意思,本人最近很穷,如果那位认为分数少问题解决我会再加!先谢谢!

解决方案 »

  1.   

    那段汇编不是很清楚。但这段代码是故弄玄虚。你可以直接定义包含“NTDLL”定义的头文件。然后用隐式的方法调用DLL。“typedef DWORD (__stdcall *PFNNTQUERYSYSTEMINFORMATION)  (DWORD, PVOID, DWORD, PDWORD);
    .....................................................
    typedef void (__stdcall *PFNRTLDESTROYQUERYDEBUGBUFFER) (PVOID);”那几句话就是定义指向函数的指针。pfnNtQuerySystemInformation =(PFNNTQUERYSYSTEMINFORMATION) GetProcAddress(hNtDll,"NtQuerySystemInformation");这句话获得NtQuerySystemInformation的函数指针(是在DLL内的相对指针)。后面的几句话大致也是同类的意思。——虽然我不太懂得汇编,现在可以大致肯定的是那几句汇编就是告诉系统现在获取的函数指针是相对指针,免得把相对指针当成绝对指针。这个源程序的作者要么是写程序年头太多,习惯改不了。要么就是故意卖弄。建议改写成用头文件+LIB的方式调用DLL的方式,没有恼人的函数指针的问题。程序的可读性也会大大提高。我现在没有MSDN的光盘,还没有查出NTDLL用的是哪个LIB和头文件。你自己可以在MSDN中查一下。
      

  2.   

    1、定义函数指针。
    2、汇编码是读写端口的,可能是串口还是并口或其他采集卡上的端口。
    3、Windows NT API library; core Windows NT component
    4、给函数指针赋值,可以用此指针调用dll中的函数。
      

  3.   

    汇编:in,out都是读写端口的指令;
    其他的好象都是DLL的调用过程,建议看一下,DLL的现式调用
    呵呵