作为 DELPHI 版本,需要引用 jwaNative, JwaWinType ,他们是 JEDI API 的一部分。JEDI 官网有下载。

先给出 2 个辅助函数 和 一些结构体。

  1. type
  2.        
  3.   PRecord = ^TRecord;  
  4.   TRecord = record
  5.   end;  
  6.        
  7.   PSystemInformationList = ^TSystemInformationList;  
  8.   TSystemInformationList = record
  9.     Count: ULONG;  
  10.     List: array [0 .. 0] of TRecord;  
  11.   end;  
  12.        
  13.   PSYSTEM_HANDLE_Informations = ^TSYSTEM_HANDLE_Informations;  
  14.   _SYSTEM_HANDLE_Informations = record
  15.     Count: ULONG;  
  16.     SH: array [0 .. 0] of _SYSTEM_HANDLE_INFORMATION;  
  17.   end;  
  18.        
  19.   TSYSTEM_HANDLE_Informations = _SYSTEM_HANDLE_Informations;  
  20.   SYSTEM_HANDLE_Informations = _SYSTEM_HANDLE_Informations;  
  21.        
  22.   PNM_INFO = ^TNM_INFO;  
  23.        
  24.   _NM_INFO = record
  25.     hFile: THandle;  
  26.     Info: _FILE_NAME_Information;  
  27.     Name: array [0 .. MAX_PATH - 1] of WideChar;  
  28.   end;  
  29.        
  30.   TNM_INFO = _NM_INFO;  
  31.   NM_INFO = _NM_INFO;  
  32.        
  33. Function GetSystemInformationClassSize(Const ATableType: SYSTEM_INFORMATION_CLASS; Const Count: ULONG): ULONG;  
  34. begin
  35.   Result := 0;  
  36.   case ATableType of
  37.     SystemBasicInformation:  
  38.       Result := $002C;  
  39.     SystemProcessorInformation:  
  40.       Result := $0000C;  
  41.     SystemPerformanceInformation:  
  42.       Result := $0138;  
  43.     // SystemTimeInformation: Result := $0020;  
  44.     // SystemPathInformation: Result := $0;  
  45.     // SystemProcessInformation: Result := $00C8 + Count;  
  46.     // SystemCallInformation: Result := $0018 + (Count * $0004);  
  47.     SystemConfigurationInformation:  
  48.       Result := $0018;  
  49.     // SystemProcessorCounters: Result := $0030 + Count;//per cpu  
  50.     SystemGlobalFlag:  
  51.       Result := $0004; // (fails if size != 4)  
  52.     // SystemCallTimeInformation: Result := $0;  
  53.     SystemModuleInformation:  
  54.       Result := $0004 + (Count * Sizeof(SYSTEM_MODULE_INFORMATION)); //(n * 0x011C)  
  55.     SystemLockInformation:  
  56.       Result := $0004 + (Count * Sizeof(SYSTEM_LOCK_INFORMATION)); //(n * 0x0024)  
  57.     // SystemStackTraceInformation: Result := $0;  
  58.     // SystemPagedPoolInformation: Result := $0;  
  59.     // SystemNonPagedPoolInformation: Result := $0;  
  60.     SystemHandleInformation:  
  61.       Result := $0004 + (Count * Sizeof(SYSTEM_HANDLE_INFORMATION)); //(n * 0x0010)  
  62.     // SystemObjectTypeInformation: Result := $0038+ + (Count * $0030);// +)  
  63.     SystemPageFileInformation:  
  64.       Result := $0018 + (Count * Sizeof(SYSTEM_PAGEFILE_INFORMATION));  
  65.     // SystemVdmInstemulInformation: Result := $0088;  
  66.     // SystemVdmBopInformation: Result := $0;  
  67.     SystemCacheInformation:  
  68.       Result := $0024;  
  69.     SystemPoolTagInformation:  
  70.       Result := $0004 + (Count * Sizeof(SYSTEM_POOL_TAG_INFORMATION)); // (n * 0x001C)  
  71.     // SystemInterruptInformation: Result := $0000 + Count;//, or 0x0018 per cpu  
  72.     SystemDpcInformation:  
  73.       Result := $0014;  
  74.     // SystemFullMemoryInformation: Result := $0;  
  75.     // SystemLoadDriver: Result := $0018;//, set mode only  
  76.     // SystemUnloadDriver: Result := $0004;//, set mode only  
  77.     // SystemTimeAdjustmentInformation: Result := $000C;//, 0x0008 writeable  
  78.     // SystemSummaryMemoryInformation: Result := $0;  
  79.     // SystemNextEventIdInformation: Result := $0;  
  80.     // SystemEventIdsInformation: Result := $0;  
  81.     SystemCrashDumpInformation:  
  82.       Result := $0004;  
  83.     SystemExceptionInformation:  
  84.       Result := $0010;  
  85.     SystemCrashDumpStateInformation:  
  86.       Result := $0004;  
  87.     // SystemDebuggerInformation: Result := $0002;  
  88.     SystemContextSwitchInformation:  
  89.       Result := $0030;  
  90.     SystemRegistryQuotaInformation:  
  91.       Result := $000C;  
  92.     // SystemAddDriver: Result := $0008;//, set mode only  
  93.     // SystemPrioritySeparationInformatio: Result := $0004;//, set mode only  
  94.     // SystemPlugPlayBusInformation: Result := $0;  
  95.     // SystemDockInformation: Result := $0;  
  96.     // SystemPowerInfo: Result := $0060;// (XP only!)  
  97.     // SystemProcessorSpeedInformation: Result := $000C;// (XP only!)  
  98.     SystemTimeZoneInformation:  
  99.       Result := $00AC;  
  100.     SystemLookasideInformation:  
  101.       Result := Count * $0020;  
  102.     SystemSetTimeSlipEvent:  
  103.       Result := $0;  
  104.     SystemCreateSession:  
  105.       Result := $0;  
  106.     SystemDeleteSession:  
  107.       Result := $0;  
  108.     SystemInvalidInfoClass1:  
  109.       Result := $0;  
  110.     SystemRangeStartInformation:  
  111.       Result := $0004; // (fails if size != 4)  
  112.     SystemVerifierInformation:  
  113.       Result := $0;  
  114.     SystemAddVerifier:  
  115.       Result := $0;  
  116.     SystemSessionProcessesInformation:  
  117.       Result := $0;  
  118.   end;  
  119. end;  
  120.        
  121. Function GetSystemInformationClassHasCount(Const ATableType: SYSTEM_INFORMATION_CLASS): BOOL;  
  122. begin
  123.   Result := False;  
  124.   case ATableType of
  125.     // SystemProcessInformation,  
  126.     // SystemCallInformation,  
  127.     // SystemProcessorCounters,  
  128.     SystemModuleInformation,  
  129.     SystemLockInformation,  
  130.     SystemHandleInformation,  
  131.     // SystemObjectTypeInformation,  
  132.     //SystemPageFileInformation, //好像这个还不确定。  
  133.     // SystemInterruptInformation,  
  134.     SystemPoolTagInformation:  
  135.       Result := True;  
  136.   end;  
  137.   //可以 和 GetSystemInformationClassSize 配合使用。  
  138. end;

  

上面的 NM_INFO 和本文无关。

大家 可以 方便的使用 GetSystemInformationTable 来 获取所需的系统信息数据。

  1. Function GetSystemInformationTable(hHeap: THandle; Const ATableType: SYSTEM_INFORMATION_CLASS; var buffSize: ULONG): PVOID;  
  2. var
  3.   OldPrivilegeAttributes: ULONG;  
  4.   hFile, hQuery: THandle;  
  5.   Status: NTSTATUS;  
  6.   cbBuffer: Cardinal;  
  7.   AVOID: PVOID;  
  8.   MinBufSize,  
  9.   ReturnLength: ULONG;  
  10.   PReturnLength: PULONG;  
  11. begin
  12.   buffSize := ;  
  13.   Result := nil;  
  14.   if not EnableDebugPrivilege(GetCurrentProcess, True, OldPrivilegeAttributes) then
  15.     Exit;  
  16.   try
  17.     ReturnLength := ;  
  18.     cbBuffer := ;  
  19.     AVOID := nil;  
  20.     PReturnLength := Addr(ReturnLength);  
  21.     Status := ZwQuerySystemInformation(ATableType, AVOID, , PReturnLength);  
  22.     if (ReturnLength > ) then // ReturnLength 一个结构的大小。  
  23.     begin
  24.       cbBuffer := ReturnLength;  
  25.       MinBufSize := ReturnLength;  
  26.       AVOID := HeapAlloc(hHeap,  or HEAP_GENERATE_EXCEPTIONS, cbBuffer);  
  27.       if not Assigned(AVOID) then
  28.         Exit;  
  29.       try
  30.         ZeroMemory(AVOID, cbBuffer);  
  31.         Status := ZwQuerySystemInformation(ATableType, AVOID, cbBuffer, PReturnLength);  
  32.         if NTSTATUS_SUCCESS(Status) then
  33.         begin
  34.           Result := AVOID;  
  35.           buffSize := cbBuffer;  
  36.         end
  37.         else if (Status = STATUS_INFO_LENGTH_MISMATCH) and GetSystemInformationClassHasCount(ATableType) then
  38.         begin
  39.           //调试中,下一秒,也许就不够用了。不调试,大概也需要多申请些空间  
  40.           //cbBuffer := GetSystemInformationClassSize(ATableType, PSystemInformationList(AVOID).Count + );  
  41.           cbBuffer := Sizeof(PSystemInformationList(AVOID).Count) +  
  42.             (MinBufSize - Sizeof(PSystemInformationList(AVOID).Count)) * (PSystemInformationList(AVOID).Count + );  
  43.           HeapFree(hHeap,  or HEAP_GENERATE_EXCEPTIONS, AVOID);  
  44.           AVOID := HeapAlloc(hHeap,  or HEAP_GENERATE_EXCEPTIONS, cbBuffer);  
  45.           if not Assigned(AVOID) then
  46.             Exit;  
  47.           try
  48.             ZeroMemory(AVOID, cbBuffer);  
  49.             Status := ZwQuerySystemInformation(ATableType, AVOID, cbBuffer, PReturnLength);  
  50.             if NTSTATUS_SUCCESS(Status) then
  51.             begin
  52.               Result := AVOID;  
  53.               buffSize := cbBuffer;  
  54.             end
  55.             else
  56.             begin
  57.               HeapFree(hHeap,  or HEAP_GENERATE_EXCEPTIONS, AVOID);  
  58.             end;  
  59.           finally
  60.           end;  
  61.         end
  62.         else
  63.         begin
  64.           HeapFree(hHeap,  or HEAP_GENERATE_EXCEPTIONS, AVOID);  
  65.           cbBuffer := $;  
  66.           repeat
  67.             AVOID := HeapAlloc(hHeap,  or HEAP_GENERATE_EXCEPTIONS, cbBuffer);  
  68.             if not Assigned(AVOID) then
  69.               Exit;  
  70.             ZeroMemory(AVOID, cbBuffer);  
  71.             Status := ZwQuerySystemInformation(ATableType, AVOID, cbBuffer, PReturnLength);  
  72.             if (Status = STATUS_INFO_LENGTH_MISMATCH) then
  73.             begin
  74.               HeapFree(hHeap,  or HEAP_GENERATE_EXCEPTIONS, AVOID);  
  75.               cbBuffer := cbBuffer * ;  
  76.             end;  
  77.             if cbBuffer > $ then
  78.             begin
  79.               Exit;  
  80.             end;  
  81.           until (Status <> STATUS_INFO_LENGTH_MISMATCH);  
  82.           if NTSTATUS_SUCCESS(Status) then
  83.           begin
  84.             Result := AVOID;  
  85.             buffSize := cbBuffer;  
  86.           end
  87.           else
  88.           begin
  89.             HeapFree(hHeap,  or HEAP_GENERATE_EXCEPTIONS, AVOID);  
  90.           end;  
  91.         end;  
  92.       finally
  93.       end;  
  94.     end
  95.     else
  96.     begin
  97.       Result := nil;  
  98.       buffSize := ;  
  99.     end;  
  100.   finally
  101.     SetDebugPrivilege(GetCurrentProcess, OldPrivilegeAttributes, OldPrivilegeAttributes);  
  102.   end;  
  103. end;

第一次 ZwQuerySystemInformation,主要是为了返回 ReturnLength,这个是 最小数据大小,一般对于单个的数据,就直接用这个值。但是对于多个的数据,这个值就是 每一个数据项的大小加上 4 。

第二次调用 ZwQuerySystemInformation,返回了一个数据区,如果多个的数据,肯定会 Status = STATUS_INFO_LENGTH_MISMATCH,所以需要第三次调用。大小有 2 种办法获取(具体看代码)。

如果不确定是不是 多个数据,但是又出现空间不够用的情况,就需要用网络上大家常见的循环增大空间的办法了。

另外 hHeap := GetProcessHeap; 可以得到 hHeap ,而且空间的申请,不一定非要用这个,也可以用  GetMem 等。

最后补上 权限提升函数。

  1. Function SetDebugPrivilege(Const hProcess: THandle; Const PrivilegeAttributes: ULONG; 
  2.   var OldPrivilegeAttributes: ULONG): Boolean; 
  3. var
  4.   hToken: THandle; 
  5.   tp: TOKEN_PRIVILEGES; 
  6.   NewPrivilegeAttributes: ULONG; 
  7.   ReturnLength: ULONG; 
  8.   hProcessToken: THandle; 
  9. begin
  10.   hToken := NULL_Handle; 
  11.   Result := False; 
  12.   OldPrivilegeAttributes := SE_PRIVILEGE_ENABLED_BY_DEFAULT; 
  13.   NewPrivilegeAttributes := PrivilegeAttributes; 
  14.   hProcessToken := hProcess; 
  15.   if hProcessToken = NULL_Handle then
  16.   begin
  17.     hProcessToken := GetCurrentProcess; 
  18.   end; 
  19.   if (OpenProcessToken(hProcessToken, TOKEN_ADJUST_PRIVILEGES, hToken)) // 获得进程访问令牌的句柄 
  20.   then
  21.   begin
  22.     try
  23.       tp.PrivilegeCount := ; 
  24.       LookupPrivilegeValue(nil, SE_DEBUG_NAME, tp.Privileges[].Luid); // 查询进程的权限,获取一个权限对应的LUID值 
  25.       OldPrivilegeAttributes := tp.Privileges[].Attributes; 
  26.       tp.Privileges[].Attributes := NewPrivilegeAttributes; 
  27.       Result := AdjustTokenPrivileges(hToken, False, tp, sizeof(tp), nil, ReturnLength); // 判断令牌权限,对这个访问令牌进行修改 
  28.     finally
  29.       CloseHandle(hToken); 
  30.     end; 
  31.   end; 
  32. end; 
  33.                   
  34. // 提升当前进程具有权限 
  35. Function EnableDebugPrivilege(Const hProcess: THandle; Const Enable: Boolean; 
  36.   var OldPrivilegeAttributes: ULONG): Boolean; 
  37. var
  38.   hToken: THandle; 
  39.   tp: TOKEN_PRIVILEGES; 
  40.   ReturnLength: ULONG; 
  41.   hProcessToken: THandle; 
  42. begin
  43.   hToken := NULL_Handle; 
  44.   Result := False; 
  45.   OldPrivilegeAttributes := SE_PRIVILEGE_ENABLED_BY_DEFAULT; 
  46.   hProcessToken := hProcess; 
  47.   if hProcessToken = NULL_Handle then
  48.   begin
  49.     hProcessToken := GetCurrentProcess; 
  50.   end; 
  51.   if (OpenProcessToken(hProcessToken, TOKEN_ADJUST_PRIVILEGES, hToken)) // 获得进程访问令牌的句柄 
  52.   then
  53.   begin
  54.     try
  55.       tp.PrivilegeCount := ; 
  56.       LookupPrivilegeValue(nil, SE_DEBUG_NAME, tp.Privileges[].Luid); // 查询进程的权限,获取一个权限对应的LUID值 
  57.       OldPrivilegeAttributes := tp.Privileges[].Attributes; 
  58.       if Enable then
  59.       begin
  60.         tp.Privileges[].Attributes := tp.Privileges[].Attributes or SE_PRIVILEGE_ENABLED; 
  61.         // tp.Privileges[].Attributes := SE_PRIVILEGE_ENABLED; 
  62.       end
  63.       else
  64.       begin
  65.         tp.Privileges[].Attributes := tp.Privileges[].Attributes and (not SE_PRIVILEGE_ENABLED); 
  66.         // tp.Privileges[].Attributes := SE_PRIVILEGE_ENABLED_BY_DEFAULT; 
  67.         // tp.Privileges[].Attributes := ; 
  68.       end; 
  69.       Result := AdjustTokenPrivileges(hToken, False, tp, sizeof(tp), nil, ReturnLength); // 判断令牌权限,对这个访问令牌进行修改 
  70.     finally
  71.       CloseHandle(hToken); 
  72.     end; 
  73.   end; 
  74. end;

特别声明
禁止 win2003 (楚凡) QQ635887 使用本人修改的控件。

禁止 qiuyan81 (苦恋树) QQ46494153 使用本人修改的内容。

禁止 gfuchao QQ82715485 使用本人修改的内容。

禁止 supersk QQ未知,使用本人修改的版本。

禁止 yesin119 QQ未知,使用本人修改的版本。

禁止 263378440 使用本人修改的版本。

禁止 yanse 使用本人修改的版本。

禁止 www123 使用本人修改的版本

禁止 eliyh 使用本人修改的版本

禁止 ltshdp、ltsh(禁卫军) 使用本人修改的版本

禁止 zwjchinazwj (蒲石) 使用本人修改的版本

禁止 zhipu QQ:2001972 使用本人修改的版本

禁止 jackalan (nVicen) QQ:875271757 使用本人修改的版本

禁止 kencc2016 (小宇) QQ:2601759381 使用本人修改的版本

以上用户名均为 2CCC 的

禁止 QQ:191909837 使用本人修改的版本
禁止 QQ 81604691 使用本人修改的版本

当然,如果你们脸皮比较厚,就偷偷的用吧。

凡是想要骂我的,都可以偷偷的用,反正我是控制不了。
只要你们不鄙视自己就行。

ZwQuerySystemInformation 安全使用心得 Delphi 版的更多相关文章

  1. 十六进制字符串转化成字符串输出HexToStr(Delphi版、C#版)

    //注意:Delphi2010以下版本默认的字符编码是ANSI,VS2010的默认编码是UTF-8,delphi版得到的字符串须经过Utf8ToAnsi()转码才能跟C#版得到的字符串显示结果一致. ...

  2. 通过崩溃地址找错误行数之Delphi版

    通过崩溃地址找错误行数之Delphi版2009-5-11 17:42:35 来源: 转载 作者:网络 访问:360 次 被顶:2 次 字号:[大 中 小]核心提示:什么是 MAP 文件?简单地讲, M ...

  3. Delphi版IP地址与整型互转

    Delphi版IP地址与整型互转 unit Unit11; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphic ...

  4. 从内存中加载DLL Delphi版(转)

    源:从内存中加载DLL DELPHI版 原文 : http://www.2ccc.com/article.asp?articleid=5784 MemLibrary.pas //从内存中加载DLL D ...

  5. 雪花算法(snowflake)delphi版

    雪花算法简单描述: + 最高位是符号位,始终为0,不可用. + 41位的时间序列,精确到毫秒级,41位的长度可以使用69年.时间位还有一个很重要的作用是可以根据时间进行排序. + 10位的机器标识,1 ...

  6. 二维码生成delphi版

    二维码生成delphi版 生成二维码的软件,代码从C语言转换过来(源地址:http://fukuchi.org/works/qrencode/),断断续续的差不多花了一周时间来转换和调试.在转换过程中 ...

  7. 从内存中加载DLL DELPHI版

    //从内存中加载DLL DELPHI版 unit MemLibrary; interface uses Windows; function memLoadLibrary(pLib: Pointer): ...

  8. [转载]《Delphi 版 everything、光速搜索代码》 关于获取文件全路径 GetFullFileName 函数的优化

    Delphi 版 everything.光速搜索代码>,文章中关于获取文件全路径的函数:GetFullFileName,有一个地方值得优化. 就是有多个文件,它们可能属于同一个目录. 譬如 Sy ...

  9. 内存中加载DLL DELPHI版

    //从内存中加载DLL DELPHI版 unit MemLibrary; interface uses Windows; function memLoadLibrary(pLib: Pointer): ...

随机推荐

  1. js入门篇之正则表达式基础

    定义:正则用于规定在文本中检索的内容,它是对字符串执行模式匹配的强大工具 RegExp(正则表达式) 对象的语法: new RegExp(pattern, attributes); pattern为一 ...

  2. windows快捷键集锦

    输入命令:netstat -ano,列出所有端口的情况.在列表中我们观察被占用的端口,比如是8090,首先找到它. 查看被占用端口对应的PID,输入命令:netstat -aon|findstr &q ...

  3. iOS开发之GCD

    GCD,全称Grand Central Dispath,是苹果开发的一种支持并行操作的机制.它的主要部件是一个FIFO队列和一个线程池,前者用来添加任务,后者用来执行任务. GCD中的FIFO队列称为 ...

  4. DOS 命令For精解示例

    最基本形态: 在cmd 窗口中:for %I in (command1) do command2 在批处理文件中:for %%I in (command1) do command2 在批处理中,FOR ...

  5. 重新用delphi7写东西

    晚上开始写通讯录的程序,又对表进行点修改.重新开始用delphi7很不习惯,太不好用了. TArecord=record Const UserName=’YHName’; ..... End; 这个在 ...

  6. 【6集iCore3_ADP触摸屏驱动讲解视频】6-1 工程及程序构架介绍

    视频简介: 该视频由银杏科技有限公司基于iCore3应用开发平台推出,包含 触摸屏驱动工程文件的介绍与程序构架的介绍等.   源视频包下载地址: http://pan.baidu.com/s/1dFz ...

  7. Spring boot 学习记录

    java的三种配置方式 基于xml的配置 基于注解的配置 基于java的配置 Spring boot推荐的配置方式:java配置+注解配置 一.注解 SpringBootApplication :等价 ...

  8. 如何优雅使用Sublime Text3(Sublime设置豆沙绿背景色和自定义主题)

    ♣Sublime Text3软件的下载 ♣设置字体的大小 ♣设置背景色和关键字颜色(Color Scheme 生成器) ♣快速生成html头文件 1.Sublime Text3软件的下载地址和包含的文 ...

  9. 树状结构Java模型、层级关系Java模型、上下级关系Java模型与html页面展示

    树状结构Java模型.层级关系Java模型.上下级关系Java模型与html页面展示 一.业务原型:公司的组织结构.传销关系网 二.数据库模型 很简单,创建 id 与 pid 关系即可.(pid:pa ...

  10. [uva12170]Easy Climb

    还是挺难的一个题,看了书上的解析以后还是不会写,后来翻了代码仓库,发现lrj又用了一些玄学的优化技巧. #include <algorithm> #include <iostream ...