作者序: WinAPIEx历时了1个多月的开发,利用业余时间来把这5年来职业软件研发工作上一些常用的稳定的功能进行接口化,终于在今天2007-07-14日发布了第一个正式版,也算是为本人从事软件研发的一个交代。在此感谢对本项目支持的众多热心网友,也感谢DCG组织朋友的支持和建议,也感谢提供源码的网友nevergone。现在正式版出来了,并不意味着我会停止开发,本人会融合更多实用和强大的接口,WinAPIEx项目将长期进行。
WinAPIEX下阶段功能: 通用算法整合 [动态数组 队列 链表 二叉平衡搜索树],这些算法一切基于STL标准算法容器库 和 BOOST容器库 来进行封装 ,这些通用算法可以支持千百万级别的数据查询 排序 搜索 。目的就是想弥补 VB DELPHI WIN32ASM 的通用算法库的不足
鉴于Windows的WIN32 API使用的复杂性和无法完整特殊需求的功能性,想自己开发一套Windows实用通用的接口库[方式: 封装 或 全写]。小软件的开发无非就是大量API的调用,特殊软件除外。
项目: Windwos实用通用接口库[WinAPIEx]
项目组织人: 猪头三
项目参与者: 80x86汇编小站休闲群 DCG组织
项目性质: 免费/收费
源码性质: 开源/闭源/授权
开发语言: C/C++
开发工具: VC++ 2005
提交性质: 如其他语言请提交lib文件给我进行整合
范围:
磁盘操作类 文件操作类 进程操作类
面向用户: 个体程序员 散户程序员
面向工程: 小型Windows桌面小软件
调用支持: VC DELPHI __STDCALL
贡献源码者:
猪头三 nevergone下载地址:
2007-07-14-V0004 Release发行版
http://www.x86asm.com/download/winapiex/WinAPIExV0004Release.rar
关于WinAPIEx项目通用算法库设计方案:整合C++ STL vector容器
该算法库的设计难点在于 如何维护和确定用户使用的每个算法容器。这个问题我思考几天,灵感来源于Windows操作系统的HANDLE表。
因此在维护每个用户使用的算法容器,也采用了HANDLE表的原理。用户每使用一个算法容器,就必须为这个算法容器建立一个HANDLE。
然后必须由一个全局的HANDLE表来维护多个算法容器。
下面实现步骤:
1> 建立一个全局HANDLE表
我采用了C++ STL 高效率的MAP容器
声明: std::map<ULONG, STRUCT_CONTAINER_OBJECT> g_ContainerObjectList ;
那么map容器的第一个参数就是算法容器的HANDLE, 第二个参数是算法容器类型
2> 声明一个算法容器类型识别结构
// 目前我们先简单的使用STL的动态数组vector
typedef struct _CONTAINER_OBJECT
{
std::vector<ULONGLONG> *pvector_UnsignPoint ; // 无符号动态数组
std::vector<LONGLONG> *pvector_signPoint ; // 有符号动态数组
}STRUCT_CONTAINER_OBJECT, *PSTRUCT_CONTAINER_OBJECT ;
3> 为每个算法容器创建一个HANDLE
说明: 为了保证唯一 和 简单性,采用了随机数方式
ULONG
Container_CreateGUI(VOID)
{
srand((unsigned)time(NULL)) ;
return rand() ;
}// End Container_CreateGUI()
4> 为了防止算法容器HANDLE的重复性,必须有个校验功能
BOOL
Container_CheckGUI(ULONG ulong_param_GUI)
{
// 在全局HANDLE表中查找是否有相同的HANDLE
if (g_ContainerObjectList.find(ulong_param_GUI) !=
g_ContainerObjectList.end())
{
return TRUE ; // 有重复的HANDLE
}
return FALSE ; // 无重复的HANDLE
}// End Container_CheckGUI()
5> 有了上面的基本模块,下面可以做一个导出接口了,供用户使用C++ STL的vector动态数组
ULONG
E_vector_Unsign_Create(VOID)
{
STRUCT_CONTAINER_OBJECT struct_VectorOBjcet ;
ULONG ulong_Object = 0 ;
SecureZeroMemory(&struct_VectorOBjcet, sizeof(STRUCT_CONTAINER_OBJECT)) ;
// 为用户建立C++ STL的vector动态数组
std::vector<ULONGLONG> *pvector_Object = new std::vector<ULONGLONG> ;
// 保存VECTOR容器指针
struct_VectorOBjcet.pvector_UnsignPoint = pvector_Object ;
// 校验容器HANDLE是否重复,如果重复则继续创建
do
{
ulong_Object = Container_CreateGUI() ;
} while(Container_CheckGUI(ulong_Object));
// 插入全局HANDLE表
if (g_ContainerObjectList.insert(std::make_pair(ulong_Object,
struct_VectorOBjcet)).second)
{
}
else
return -1 ; // 插入失败
return ulong_Object ; // 返回用户的算法容器HANDLE
}// End vector_Unsign_Create()
好,下面我们验证一下思路:
int main()
{
for (ULONG ulong_Count = 0 ;
ulong_Count < 20 ;
ulong_Count++)
{
E_vector_Unsign_Create() ; // 创建20个算法容器
}
// 打印20个算法容器的信息
std::map<ULONG, STRUCT_CONTAINER_OBJECT>::iterator map_Next ;
for (map_Next = g_ContainerObjectList.begin() ;
map_Next != g_ContainerObjectList.end() ;
map_Next++)
{
printf("vector Handle: %d vector Point: %p \n",
map_Next->first,
((STRUCT_CONTAINER_OBJECT)map_Next->second).pvector_UnsignPoint) ;
// 释放用户算法容器
delete ((STRUCT_CONTAINER_OBJECT)map_Next->second).pvector_UnsignPoint ;
}
}
运行效果:
vector Handle: 12081 vector Point: 00CB2970
vector Handle: 12084 vector Point: 00CB2A18
vector Handle: 12087 vector Point: 00CB2AC0
vector Handle: 12091 vector Point: 00CB2B68
vector Handle: 12094 vector Point: 00CB2C10
vector Handle: 12097 vector Point: 00CB2CB8
vector Handle: 12100 vector Point: 00CB2D60
vector Handle: 12104 vector Point: 00CB2E08
vector Handle: 12107 vector Point: 00CB2EB0
vector Handle: 12110 vector Point: 00CB2F58
vector Handle: 12114 vector Point: 00CB3000
vector Handle: 12117 vector Point: 00CB30A8
vector Handle: 12120 vector Point: 00CB3150
vector Handle: 12123 vector Point: 00CB31F8
vector Handle: 12127 vector Point: 00CB32A0
vector Handle: 12130 vector Point: 00CB3348
vector Handle: 12133 vector Point: 00CB33F0
vector Handle: 12136 vector Point: 00CB6C10
vector Handle: 12140 vector Point: 00CB6CB8
vector Handle: 12143 vector Point: 00CB6D60
[DISK][整合]
E_Disk_IsDynamicDisk [作者: 猪头三 性质: 闭源 修改时间: 2007-06-18 功能: 判断物理磁盘是否是动态磁盘]
E_Disk_ReadData [作者 :猪头三 性质: 授权 修改时间: 2007-06-18 功能: 读取物理磁盘数据]
E_Disk_WriteData [作者 :猪头三 性质: 授权 修改时间: 2007-06-18 功能: 写入物理磁盘数据]
E_Disk_GetDiskGeometry [作者: 猪头三 性质: 授权 修改时间: 2007-06-18 功能: 获取物理磁盘基本信息参数]
E_Disk_GetPartitionType [作者: 猪头三 性质: 授权 修改时间: 2007-06-18 功能: 获取指定分区类型]
E_Disk_GetDiskNumberByFilePath [作者: 猪头三 性质: 授权 修改时间: 2007-06-19 功能: 获取指定分区所在的磁盘]
E_Disk_GetPartitionInfoByFilePath [作者: 猪头三 性质: 授权 修改时间: 2007-06-19 功能: 获取指定分区基本信息]
E_Disk_GetPartitionSpace [作者: 猪头三 性质: 授权 修改时间: 2007-06-19 功能: 获取指定分区实际空闲容量和实际总容量]
E_Disk_GetDiskNumber [作者: 猪头三 性质: 授权 修改时间: 2007-06-21 功能: 获取物理磁盘数量]
E_Disk_FormatPartition [作者: 猪头三 性质: 授权 修改时间: 2007-06-22 功能: 格式化指定分区]
[PROCESS][整合]
E_Pro_RaiseDebugPrivilege [作者: nevergone 性质: 授权 修改时间: 2007-06-24 功能: 提升进程访问权限[DEBUG权限]]
E_Pro_KillProcessByPid [作者: nevergone 性质: 授权 修改时间: 2007-06-24 功能: 通过进程ID结束进程[函数内已提权]]
E_Pro_KillProcessByName [作者: nevergone 性质: 授权 修改时间: 2007-06-24 功能: 通过进程名结束进程[函数内已提权]]
E_Pro_InjectDll [作者: 猪头三 性质:授权 修改时间: 2007-06-26 功能: 远程注入DLL]
E_Pro_FreeInjectDll [作者: 猪头三 性质:授权 修改时间: 2007-06-30 功能: 远程释放注入DLL[也可以释放远进程目标DLL[已提权 WIN32 API极限]]
[FILE][整合]
E_File_SHCopyAllFile [作者: 猪头三 性质: 受权 修改时间: 2007-07-07 功能: 多文件复制到目标文件夹]
E_File_SHDeleteAllFile [作者: 猪头三 性质: 受权 修改时间: 2007-07-10 功能: 删除指定目录下的所有文件包括子目录]
E_File_DeleteDestroyFile [作者: 猪头三 性质: 闭源 修改时间: 2007-07-13 功能: 删除文件并粉碎数据]
E_File_SHCreateBigFile [作者: 猪头三 性质: 授权 修改时间: 2007-07-14 功能: 创建特大型空文件]
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课