一些函数,包括内存映像等(一)
很早以前写的,还是有一些用处的
----------------------------
////////////////////////////////////////////////////////////////////////////////
// 该单元提供所需工具函数的实现
////////////////////////////////////////////////////////////////////////////////
unit untTools;
interface
uses Classes, Windows, SysUtils, TlHelp32, untDef, Registry;
// ----------------------------FindProcessID------------------------------------
// 名 称:FindProcessID
// 功 能:查找指定名称的进程的ID
// 参 数:procName 要查找的进程的名称,不包括路径
// 返 回值:0 失败
// 其他 进程ID
// 日 期:2004.02.02
// 修 改:????.??.??
function FindProcessID(procName: pchar): THandle; export;
// ----------------------------ListProcesses------------------------------------
// 名 称:ListProcesses
// 功 能:列举当前系统中运行的进程
// 参 数:pl 用于返回进程列表
// 当pl为nil时则返回当前系统中的进程数量
// 返 回 值:当前运行的进程数量
// 日 期:2004.02.02
// 修 改:????.??.??
function ListProcesses(pl: PList): integer; export;
// ------------------------------ListThreads------------------------------------
// 名 称:ListProcesses
// 功 能:列举当前系统中运行的线程
// 参 数:pID 进程ID,如果为-1则表示列出系统中所有的线程
// pl 用于返回线程列表
// 当pl为nil时则返回当前系统中的进程数量
// 返 回 值:当前运行的进程数量
// 日 期:2004.02.20
// 修 改:????.??.??
function ListThreads(pID: integer; pl: PList): integer; export;
// ----------------------------SetPrivilege-------------------------------------
// 名 称:SetPrivilege
// 功 能:设置进程权限
// 参 数:hToken 指定的进程
// strPrivilege 权限描述
// bEnable 使能
// 返 回 值:成功与否
// 日 期:2004.02.02
// 修 改:????.??.??
function SetPrivilege(hToken: THandle; strPrivilege: PChar; bEnable: BOOL): BOOL; export;
// ----------------------------SetCurProcDbgPrivilege---------------------------
// 名 称:SetCurProcDbgPrivilege
// 功 能:设置/取消当前进程为DEBUG权限
// 参 数:bEnable
// TRUE 设置
// FALSE 取消
// 返 回 值:成功与否
// 日 期:2004.02.02
// 修 改:????.??.??
function SetCurProcDbgPrivilege(bEnabled: boolean): BOOL; export;
// ------------------------------GetOSVersion-----------------------------------
// 名 称:GetOSVersion
// 功 能:取得当前操作系统的版本
// 参 数:无
// 返 回 值:操作系统的版本代号
// 日 期:2004.02.03
// 修 改:????.??.??
function GetOSVersion: integer; export;
// --------------------------------ExitWin2000----------------------------------
// 名 称:ExitWin2000
// 功 能:退出win2000操作系统
// 参 数:ewx 退出类型,关机、注销等,见EWX_POWEROFF
定义
// 返 回 值:
// 日 期:2004.02.03
// 修 改:????.??.??
procedure ExitWin2000(ewx: integer); export;
// --------------------------------ExitWin9x------------------------------------
// 名 称:ExitWin9x
// 功 能:退出win9x操作系统
// 参 数:ewx 退出类型,关机、注销等,见EWX_POWEROFF
定义
// 返 回 值:
// 日 期:2004.02.03
// 修 改:????.??.??
procedure ExitWin9x(EWX: integer); export;
// --------------------------------ShutDownPC-----------------------------------
// 名 称:ShutDownPC
// 功 能:关闭计算机
// 参 数:无
// 返 回 值:
// 日 期:2004.02.03
// 修 改:????.??.??
procedure ShutDownPC; export;
// --------------------------------GetFileDateTime-------------------------------
// 名 称:GetFileDateTime
// 功 能:取得指定文件的指定的日期
// 参 数:
// FileName 文件名称,必须为文件全名,包括路径
// FileTimeType 指定文件的日期,参见TFileTimeType定义
// 返 回 值:指定文件信息中的时间
// 日 期:2004.02.03
// 修 改:????.??.??
function GetFileDateTime(const FileName: String; FileTimeType: TFileTimeType): TDateTime; export;
// --------------------------------SetFileDateTime-------------------------------
// 名 称:SetFileDateTime
// 功 能:设定指定文件的指定的日期
// 参 数:
// FileName 文件名称,必须为文件全名,包括路径
// FileTimeType 指定文件的日期,参见TFileTimeType定义
// aDateTime 要指定为的时间
// 返 回 值: 0 成功; 其它为错误信息
// 日 期:2004.02.03
// 修 改:????.??.??
function SetFileDateTime(const FileName: string; FileTimeType: TFileTimeType; aDateTime: TDateTime): Integer; export;
// --------------------------------ListFiles---------------------------------------
// 名 称:ListFiles
// 功 能:必须调用两次,首先调用时给定pFL为nil以取得数量
// 然后为pFL申请空间
// 然后第二次调用该函数,以取得文件列表
// 参 数:
// Path 要查询的目录
// pFL 返回列表,nil 表示要取得当前目录包括的文件和目录的总和
// 返 回 值:当前目录中的文件数量,包括目录
// 日 期:2004.02.03
// 修 改:????.??.??
function ListFiles(const Path: string; pFI: PList): integer; export;
// --------------------------------StartScoutReg--------------------------------
// 名 称:StartScoutReg
// 功 能:实现指定的注册表键及其子键监视
// 参 数:
// RootKey 根键
// Key 要监视的键
// Filter 要监视的事件
// 包括REG_NOTIFY_CHANGE_NAME
// or REG_NOTIFY_CHANGE_ATTRIBUTES
// or REG_NOTIFY_CHANGE_LAST_SET
// or REG_NOTIFY_CHANGE_SECURITY
// 0 表示全部
// Handle 当注册表有改动后接受消息的据窗口的句柄
// MsgValue 当注册表有改动后接受消息的据窗口需要处理的消息
// 当消息的wParam值为0时表示注册表有改动
// 当消息的wParam值为1时表示试图开始监视
// 当消息的wParam值为2时表示监视失败
// 返 回值:监视线程的句柄,调用者必须保存该句柄,当取消监视时TerminateThread函数需要使用这个值
// 日 期:2004.02.04
// 修 改:????.??.??
function StartScoutReg(RootKey: HKEY; key: string; Filter: integer; Handle: THandle; MsgValue: integer): DWORD; export;
// --------------------------------KillProcess----------------------------------
// 名 称:KillProcess
// 功 能:终止指定ID的进程,该函数可以终止大多数的进程
// 参 数:ProcID 要终止的进程的ID
// 返 回 值:无
// 日 期:2004.02.04
// 修 改:????.??.??
procedure KillProcess(ProcID: DWORD); export;
// --------------------------------WriteShareData-------------------------------
// 名 称:WriteShareData
// 功 能:写内存映像文件,保存一个整形数据
// 参 数:
// ShareName 内存映像文件的唯一标示
// Data 要写入的数据
// DataSize 数据的大小
// 返 回值:内存映像的句柄,调用者需要保存,在它不再使用后要CloseHandle
// 日 期:2004.02.05
// 修 改:????.??.??
function WriteShareData(ShareName: pchar; Data: pointer; DataSize: Cardinal): THandle; export;
// --------------------------------ReadShareData--------------------------------
// 名 称:ReadShareData
// 功 能:写内存映像文件,保存一个整形数据
// 参 数:
// ShareName 内存映像文件的唯一标示,必须是已经存在的
// Data 读出的数据缓冲区
// DataSize 要读出数据缓冲的大小,调用者必须知道
// 返 回 值:无
// 日 期:2004.02.05
// 修 改:????.??.??
procedure ReadShareData(ShareName: pchar; Data: pointer; DataSize: Cardinal); export;
// --------------------------------WriteShareInteger----------------------------
// 名 称:WriteShareInteger
// 功 能:写内存映像文件,保存一个整形数据
// 参 数:
// ShareName 内存映像文件的唯一标示
// h 要写入的数据
// 返 回值:内存映像的句柄,调用者需要保存,在它不再使用后要CloseHandle
// 日 期:2004.02.05
// 修 改:????.??.??
function WriteShareInteger(ShareName: pchar; h: integer): THandle; export;
// --------------------------------ReadShareInteger-----------------------------
// 名 称:ReadShareInteger
// 功 能:读内存映像文件中的整形数据
// 参 数:
// ShareName 内存映像文件的唯一标示,必须是已经存在的
// 返 回 值:内存映像文件中的数据
// 日 期:2004.02.05
// 修 改:????.??.??
function ReadShareInteger(ShareName: pchar): integer; export;
// --------------------------------RunAndWaitForExe-----------------------------
// 名 称:RunAndWaitForExe
// 功 能:运行指定的程序并等待其执行结束
// 参 数:
// appName 要运行的程序的名称
// cmdLine 命令行参数
// 返 回 值:
// -1 运行程序失败
// 其他 程序退出的flag
// 日 期:2004.02.06
// 修 改:????.??.??
function RunAndWaitForExe(appName: pchar; cmdLine: pchar): integer; export;
implementation
function FindProcessID(procName: pchar): THandle;
var
lppe: TProcessEntry32;
SSHandle: THandle;
Found: boolean;
begin
result := 0;
SSHandle := CreateToolHelp32SnapShot(TH32CS_SNAPALL, 0); // 取得系统快照
try
lppe.dwSize := sizeof(lppe);
Found := Process32First(SSHandle, lppe); // 从中取出第一个进程的部分属性
while Found do
begin
if ansiCompareText(ExtractFileName(lppe.szExeFile), procName) = 0 then
begin
result := lppe.th32ProcessID;
break;
end;
Found := Process32Next(SSHandle, lppe); // 从中取出下一个进程的部分属性
end;
finally
CloseHandle(SSHandle);
end;
end;
function ListProcesses(pl: PList): integer;
var
lppe: TProcessEntry32;
SSHandle: THandle;
Found: boolean;
pi: PProcInfo;
begin
SSHandle := CreateToolHelp32SnapShot(TH32CS_SNAPALL, 0);
try
result := 0;
lppe.dwSize := sizeof(lppe);
Found := Process32First(SSHandle, lppe);
while Found do
begin
inc(result);
try
if pl <> nil then
begin
new(pi);
pi^.ProcID := lppe.th32ProcessID;
pi^.ExeFile := lppe.szExeFile;
pi^.CntThread := lppe.cntThreads;
pl^.Add(TObject(pi));
end;
except
break;
end;
Found := Process32Next(SSHandle, lppe);
end;
finally
CloseHandle(SSHandle);
end;
end;
// 该单元提供所需工具函数的实现
////////////////////////////////////////////////////////////////////////////////
unit untTools;
interface
uses Classes, Windows, SysUtils, TlHelp32, untDef, Registry;
// ----------------------------FindProcessID------------------------------------
// 名 称:FindProcessID
// 功 能:查找指定名称的进程的ID
// 参 数:procName 要查找的进程的名称,不包括路径
// 返 回值:0 失败
// 其他 进程ID
// 日 期:2004.02.02
// 修 改:????.??.??
function FindProcessID(procName: pchar): THandle; export;
// ----------------------------ListProcesses------------------------------------
// 名 称:ListProcesses
// 功 能:列举当前系统中运行的进程
// 参 数:pl 用于返回进程列表
// 当pl为nil时则返回当前系统中的进程数量
// 返 回 值:当前运行的进程数量
// 日 期:2004.02.02
// 修 改:????.??.??
function ListProcesses(pl: PList): integer; export;
// ------------------------------ListThreads------------------------------------
// 名 称:ListProcesses
// 功 能:列举当前系统中运行的线程
// 参 数:pID 进程ID,如果为-1则表示列出系统中所有的线程
// pl 用于返回线程列表
// 当pl为nil时则返回当前系统中的进程数量
// 返 回 值:当前运行的进程数量
// 日 期:2004.02.20
// 修 改:????.??.??
function ListThreads(pID: integer; pl: PList): integer; export;
// ----------------------------SetPrivilege-------------------------------------
// 名 称:SetPrivilege
// 功 能:设置进程权限
// 参 数:hToken 指定的进程
// strPrivilege 权限描述
// bEnable 使能
// 返 回 值:成功与否
// 日 期:2004.02.02
// 修 改:????.??.??
function SetPrivilege(hToken: THandle; strPrivilege: PChar; bEnable: BOOL): BOOL; export;
// ----------------------------SetCurProcDbgPrivilege---------------------------
// 名 称:SetCurProcDbgPrivilege
// 功 能:设置/取消当前进程为DEBUG权限
// 参 数:bEnable
// TRUE 设置
// FALSE 取消
// 返 回 值:成功与否
// 日 期:2004.02.02
// 修 改:????.??.??
function SetCurProcDbgPrivilege(bEnabled: boolean): BOOL; export;
// ------------------------------GetOSVersion-----------------------------------
// 名 称:GetOSVersion
// 功 能:取得当前操作系统的版本
// 参 数:无
// 返 回 值:操作系统的版本代号
// 日 期:2004.02.03
// 修 改:????.??.??
function GetOSVersion: integer; export;
// --------------------------------ExitWin2000----------------------------------
// 名 称:ExitWin2000
// 功 能:退出win2000操作系统
// 参 数:ewx 退出类型,关机、注销等,见EWX_POWEROFF
定义// 返 回 值:
// 日 期:2004.02.03
// 修 改:????.??.??
procedure ExitWin2000(ewx: integer); export;
// --------------------------------ExitWin9x------------------------------------
// 名 称:ExitWin9x
// 功 能:退出win9x操作系统
// 参 数:ewx 退出类型,关机、注销等,见EWX_POWEROFF
定义// 返 回 值:
// 日 期:2004.02.03
// 修 改:????.??.??
procedure ExitWin9x(EWX: integer); export;
// --------------------------------ShutDownPC-----------------------------------
// 名 称:ShutDownPC
// 功 能:关闭计算机
// 参 数:无
// 返 回 值:
// 日 期:2004.02.03
// 修 改:????.??.??
procedure ShutDownPC; export;
// --------------------------------GetFileDateTime-------------------------------
// 名 称:GetFileDateTime
// 功 能:取得指定文件的指定的日期
// 参 数:
// FileName 文件名称,必须为文件全名,包括路径
// FileTimeType 指定文件的日期,参见TFileTimeType定义
// 返 回 值:指定文件信息中的时间
// 日 期:2004.02.03
// 修 改:????.??.??
function GetFileDateTime(const FileName: String; FileTimeType: TFileTimeType): TDateTime; export;
// --------------------------------SetFileDateTime-------------------------------
// 名 称:SetFileDateTime
// 功 能:设定指定文件的指定的日期
// 参 数:
// FileName 文件名称,必须为文件全名,包括路径
// FileTimeType 指定文件的日期,参见TFileTimeType定义
// aDateTime 要指定为的时间
// 返 回 值: 0 成功; 其它为错误信息
// 日 期:2004.02.03
// 修 改:????.??.??
function SetFileDateTime(const FileName: string; FileTimeType: TFileTimeType; aDateTime: TDateTime): Integer; export;
// --------------------------------ListFiles---------------------------------------
// 名 称:ListFiles
// 功 能:必须调用两次,首先调用时给定pFL为nil以取得数量
// 然后为pFL申请空间
// 然后第二次调用该函数,以取得文件列表
// 参 数:
// Path 要查询的目录
// pFL 返回列表,nil 表示要取得当前目录包括的文件和目录的总和
// 返 回 值:当前目录中的文件数量,包括目录
// 日 期:2004.02.03
// 修 改:????.??.??
function ListFiles(const Path: string; pFI: PList): integer; export;
// --------------------------------StartScoutReg--------------------------------
// 名 称:StartScoutReg
// 功 能:实现指定的注册表键及其子键监视
// 参 数:
// RootKey 根键
// Key 要监视的键
// Filter 要监视的事件
// 包括REG_NOTIFY_CHANGE_NAME
// or REG_NOTIFY_CHANGE_ATTRIBUTES
// or REG_NOTIFY_CHANGE_LAST_SET
// or REG_NOTIFY_CHANGE_SECURITY
// 0 表示全部
// Handle 当注册表有改动后接受消息的据窗口的句柄
// MsgValue 当注册表有改动后接受消息的据窗口需要处理的消息
// 当消息的wParam值为0时表示注册表有改动
// 当消息的wParam值为1时表示试图开始监视
// 当消息的wParam值为2时表示监视失败
// 返 回值:监视线程的句柄,调用者必须保存该句柄,当取消监视时TerminateThread函数需要使用这个值
// 日 期:2004.02.04
// 修 改:????.??.??
function StartScoutReg(RootKey: HKEY; key: string; Filter: integer; Handle: THandle; MsgValue: integer): DWORD; export;
// --------------------------------KillProcess----------------------------------
// 名 称:KillProcess
// 功 能:终止指定ID的进程,该函数可以终止大多数的进程
// 参 数:ProcID 要终止的进程的ID
// 返 回 值:无
// 日 期:2004.02.04
// 修 改:????.??.??
procedure KillProcess(ProcID: DWORD); export;
// --------------------------------WriteShareData-------------------------------
// 名 称:WriteShareData
// 功 能:写内存映像文件,保存一个整形数据
// 参 数:
// ShareName 内存映像文件的唯一标示
// Data 要写入的数据
// DataSize 数据的大小
// 返 回值:内存映像的句柄,调用者需要保存,在它不再使用后要CloseHandle
// 日 期:2004.02.05
// 修 改:????.??.??
function WriteShareData(ShareName: pchar; Data: pointer; DataSize: Cardinal): THandle; export;
// --------------------------------ReadShareData--------------------------------
// 名 称:ReadShareData
// 功 能:写内存映像文件,保存一个整形数据
// 参 数:
// ShareName 内存映像文件的唯一标示,必须是已经存在的
// Data 读出的数据缓冲区
// DataSize 要读出数据缓冲的大小,调用者必须知道
// 返 回 值:无
// 日 期:2004.02.05
// 修 改:????.??.??
procedure ReadShareData(ShareName: pchar; Data: pointer; DataSize: Cardinal); export;
// --------------------------------WriteShareInteger----------------------------
// 名 称:WriteShareInteger
// 功 能:写内存映像文件,保存一个整形数据
// 参 数:
// ShareName 内存映像文件的唯一标示
// h 要写入的数据
// 返 回值:内存映像的句柄,调用者需要保存,在它不再使用后要CloseHandle
// 日 期:2004.02.05
// 修 改:????.??.??
function WriteShareInteger(ShareName: pchar; h: integer): THandle; export;
// --------------------------------ReadShareInteger-----------------------------
// 名 称:ReadShareInteger
// 功 能:读内存映像文件中的整形数据
// 参 数:
// ShareName 内存映像文件的唯一标示,必须是已经存在的
// 返 回 值:内存映像文件中的数据
// 日 期:2004.02.05
// 修 改:????.??.??
function ReadShareInteger(ShareName: pchar): integer; export;
// --------------------------------RunAndWaitForExe-----------------------------
// 名 称:RunAndWaitForExe
// 功 能:运行指定的程序并等待其执行结束
// 参 数:
// appName 要运行的程序的名称
// cmdLine 命令行参数
// 返 回 值:
// -1 运行程序失败
// 其他 程序退出的flag
// 日 期:2004.02.06
// 修 改:????.??.??
function RunAndWaitForExe(appName: pchar; cmdLine: pchar): integer; export;
implementation
function FindProcessID(procName: pchar): THandle;
var
lppe: TProcessEntry32;
SSHandle: THandle;
Found: boolean;
begin
result := 0;
SSHandle := CreateToolHelp32SnapShot(TH32CS_SNAPALL, 0); // 取得系统快照
try
lppe.dwSize := sizeof(lppe);
Found := Process32First(SSHandle, lppe); // 从中取出第一个进程的部分属性
while Found do
begin
if ansiCompareText(ExtractFileName(lppe.szExeFile), procName) = 0 then
begin
result := lppe.th32ProcessID;
break;
end;
Found := Process32Next(SSHandle, lppe); // 从中取出下一个进程的部分属性
end;
finally
CloseHandle(SSHandle);
end;
end;
function ListProcesses(pl: PList): integer;
var
lppe: TProcessEntry32;
SSHandle: THandle;
Found: boolean;
pi: PProcInfo;
begin
SSHandle := CreateToolHelp32SnapShot(TH32CS_SNAPALL, 0);
try
result := 0;
lppe.dwSize := sizeof(lppe);
Found := Process32First(SSHandle, lppe);
while Found do
begin
inc(result);
try
if pl <> nil then
begin
new(pi);
pi^.ProcID := lppe.th32ProcessID;
pi^.ExeFile := lppe.szExeFile;
pi^.CntThread := lppe.cntThreads;
pl^.Add(TObject(pi));
end;
except
break;
end;
Found := Process32Next(SSHandle, lppe);
end;
finally
CloseHandle(SSHandle);
end;
end;
浙公网安备 33010602011771号