首页
论坛
课程
招聘

[原创]Windows API 绝大部分函数类型定义(方便动态获取函数)

2011-8-21 20:23 6481

[原创]Windows API 绝大部分函数类型定义(方便动态获取函数)

2011-8-21 20:23
6481
包包含文件:

_ntdll.h
_WINBASE.H
_WININET.H
_WINSOCK2.H
_urlmon.h
_SHELLAPI.H
_IPHlpApi.h

以下是片段



typedef
HANDLE
(WINAPI *_CREATEFILEA)(
	LPCSTR lpFileName,
	DWORD dwDesiredAccess,
	DWORD dwShareMode,
	LPSECURITY_ATTRIBUTES lpSecurityAttributes,
	DWORD dwCreationDisposition,
	DWORD dwFlagsAndAttributes,
	HANDLE hTemplateFile 
	);

//====================================================

typedef
HANDLE
(WINAPI *_CREATEFILEW)(
	LPCWSTR lpFileName,
	DWORD dwDesiredAccess,
	DWORD dwShareMode,
	LPSECURITY_ATTRIBUTES lpSecurityAttributes,
	DWORD dwCreationDisposition,
	DWORD dwFlagsAndAttributes,
	HANDLE hTemplateFile 
	);

//====================================================

typedef
BOOL
(WINAPI *_SETFILEATTRIBUTESA)(
	LPCSTR lpFileName,
	DWORD dwFileAttributes 
	);

//====================================================

typedef
BOOL
(WINAPI *_SETFILEATTRIBUTESW)(
	LPCWSTR lpFileName,
	DWORD dwFileAttributes 
	);

//====================================================

typedef
DWORD
(WINAPI *_GETFILEATTRIBUTESA)(
	LPCSTR lpFileName 
	);

//====================================================

typedef
DWORD
(WINAPI *_GETFILEATTRIBUTESW)(
	LPCWSTR lpFileName 
	);

//====================================================

typedef
BOOL
(WINAPI *_GETFILEATTRIBUTESEXA)(
	LPCSTR lpFileName,
	GET_FILEEX_INFO_LEVELS fInfoLevelId,
	LPVOID lpFileInformation 
	);

//====================================================

typedef
BOOL
(WINAPI *_GETFILEATTRIBUTESEXW)(
	LPCWSTR lpFileName,
	GET_FILEEX_INFO_LEVELS fInfoLevelId,
	LPVOID lpFileInformation 
	);

//====================================================

typedef
DWORD
(WINAPI *_GETCOMPRESSEDFILESIZEA)(
	LPCSTR lpFileName,
	LPDWORD lpFileSizeHigh 
	);

//====================================================

typedef
DWORD
(WINAPI *_GETCOMPRESSEDFILESIZEW)(
	LPCWSTR lpFileName,
	LPDWORD lpFileSizeHigh 
	);

//====================================================

typedef
BOOL
(WINAPI *_DELETEFILEA)(
	LPCSTR lpFileName 
	);

//====================================================

typedef
BOOL
(WINAPI *_DELETEFILEW)(
	LPCWSTR lpFileName 
	);

//====================================================

// typedef
// HANDLE
// (WINAPI *_FINDFIRSTFILEEXA)(
// 	LPCSTR lpFileName,
// 	FINDEX_INFO_LEVELS fInfoLevelId,
// 	LPVOID lpFindFileData,
// 	FINDEX_SEARCH_OPS fSearchOp,
// 	LPVOID lpSearchFilter,
// 	DWORD dwAdditionalFlags 
// 	);

//====================================================

// typedef
// HANDLE
// (WINAPI *_FINDFIRSTFILEEXW)(
// 	LPCWSTR lpFileName,
// 	FINDEX_INFO_LEVELS fInfoLevelId,
// 	LPVOID lpFindFileData,
// 	FINDEX_SEARCH_OPS fSearchOp,
// 	LPVOID lpSearchFilter,
// 	DWORD dwAdditionalFlags 
// 	);

//====================================================

typedef
HANDLE
(WINAPI *_FINDFIRSTFILEA)(
	LPCSTR lpFileName,
	LPWIN32_FIND_DATAA lpFindFileData 
	);

//====================================================

typedef
HANDLE
(WINAPI *_FINDFIRSTFILEW)(
	LPCWSTR lpFileName,
	LPWIN32_FIND_DATAW lpFindFileData 
	);

//====================================================

typedef
BOOL
(WINAPI *_FINDNEXTFILEA)(
	HANDLE hFindFile,
	LPWIN32_FIND_DATAA lpFindFileData 
	);

//====================================================

typedef
BOOL
(WINAPI *_FINDNEXTFILEW)(
	HANDLE hFindFile,
	LPWIN32_FIND_DATAW lpFindFileData 
	);

//====================================================

typedef
DWORD
(WINAPI *_SEARCHPATHA)(
	LPCSTR lpPath,
	LPCSTR lpFileName,
	LPCSTR lpExtension,
	DWORD nBufferLength,
	LPSTR lpBuffer,
	LPSTR *lpFilePart 
	);


// 提取工具源代码

赶时间代码写的很随便,遇到处理不了的还需要修改

	//
	// 1.去掉所有换行 2. 空格 或 Table 替换为换行
	//
	char file_path[MAX_PATH] = {0};
	//cout<<"Please input file path:";
	//cin>>file_path;
	CString szfile_path("D:\\Microsoft Visual Studio 6.0\\VC98\\Include\\ntdll.h");
	CFile fileTest;
	if(!fileTest.Open(szfile_path, CFile::modeRead)) {
		cout<<"Open file failed!"<<endl;
		return ERROR;
	}
	CString fileName(fileTest.GetFileName());
	fileTest.Close();

	//
	//  第一步,整理源代码
	//
	fstream f;
	f.open(szfile_path, ios::in);

	CFile fileCopy("d:\\tmp_"+fileName, CFile::modeCreate|CFile::modeWrite);

	while (!f.eof()) {
		char s[MAX_PATH] = {0};
		f.getline(s, MAX_PATH);
 		CString szCode(s);
 		szCode.TrimLeft();
 		szCode.TrimRight();
		// 去掉注释
		int iFind = szCode.Find("//", 0);
		if (iFind != -1){
			szCode = szCode.Left(iFind);
		}
		if (szCode.GetLength() == 0)
			continue;
		//
		// 替换预定义
		//
		szCode.Replace("BOOLAPI","INTERNETAPI BOOL WINAPI");
		szCode.Replace("STDAPI", "EXTERN_C HRESULT __stdcall");

		int l = szCode.GetLength();
		CString szTmp;

		// replace ' ' and '\t'
		// 多个空格替换为 一个
		for (int i=0; i<l; i++){
			if ((szTmp.Right(1) == "\t" || szTmp.Right(1) == " ") 
					&& (szCode[i] == '\t' || szCode[i] == ' '))
				continue;
			szTmp += szCode[i];
		}
		szTmp.Replace(" ", "\n");
		szTmp.Replace("\t", "\n");
		szTmp.Replace("(", "\n(\n");
		szTmp.Replace(")", "\n)");
		// 尾部添加回车
		szTmp += "\n";
		l = szTmp.GetLength();

		// 删除头部回车
		for (int j = 0; j<l; j++){
			if (szTmp[j] != '\n')
				break;
			szTmp.Delete(0);
		}
		// 多个回车 替换为  一个
		l = szTmp.GetLength();
		CString szTmp2;
		for (int k=0; k<l; k++)
		{
			if (szTmp2.Right(1) == "\n" && szTmp[k] == '\n')
				continue;
			szTmp2 += szTmp[k];
		}
		szTmp2.Replace("\n", "\r\n");
		fileCopy.Write((LPCTSTR)szTmp2, szTmp2.GetLength());
	}

	fileCopy.Close();
	f.close();

	fstream f2;
	f2.open("d:\\tmp_"+fileName, ios::in);
	CFile fileCopy2("d:\\_"+fileName, CFile::modeCreate|CFile::modeWrite);

	CString szInclude;
	szInclude.Format("#include <%s>\r\n#pragma once\r\n", fileName);
	fileCopy2.Write((LPCTSTR)szInclude, szInclude.GetLength());
	fileCopy2.Write("\r\n\r\n//====================================================\r\n\r\n",
		strlen("\r\n\r\n//====================================================\r\n\r\n"));

	//
	//  第二步,转换成类型定义
	//

	CString sLast;
	while (!f2.eof()) {
		char s[MAX_PATH] = {0};
		f2.getline(s, MAX_PATH);
		if(s[0] == '\0') continue;
		
		//fileCopy2.Write((LPCTS1TR)szCode, szCode.GetLength());
		if (strcmp("WINAPI", s) == 0 ||
			strcmp("WSAAPI", s) == 0||
			strcmp("APIENTRY", s) == 0 ||
			strcmp("__stdcall", s) == 0 ||
			strcmp("NTAPI", s) == 0)
		{

			CString sx(s);
			sx.Insert(0, "(");
			sx += " ";
			f2.getline(s, MAX_PATH);
			if(s[0] == '*') continue;

			fileCopy2.Write("typedef\r\n",9);
			sLast += "\r\n";
			
			fileCopy2.Write((LPCSTR)sLast, sLast.GetLength()); //写入返回类型
			
			fileCopy2.Write((LPCSTR)sx, sx.GetLength());//写入调用约定
			
			sx = s;
			sx.MakeUpper();
			sx.Insert(0, "*_");
			fileCopy2.Write((LPCSTR)sx, sx.GetLength()); //写入大写的函数名
			
			//
			// 循环写入 直到函数定义结束
			//
			while (1){

				char s[MAX_PATH] = {0};
				f2.getline(s, MAX_PATH);
				sx = s;
				if(sx.Right(1) != "(" && sx.Right(1) != "," && sx.Right(1) != ")" && sx.Right(1) != ";")
					sx += " ";
				sx.Replace(")", "\r\n\t)");
				sx.Replace("(", ")(\r\n\t");
				sx.Replace(",", ",\r\n\t");

				fileCopy2.Write((LPCSTR)sx, sx.GetLength());
				
				// 找到结束 ?
				if(sx.Find(";")>=0){
					fileCopy2.Write("\r\n\r\n//====================================================\r\n\r\n",
						strlen("\r\n\r\n//====================================================\r\n\r\n"));
					break;
				}
			}
		}
		
		sLast = s;
	}

	fileCopy2.Close();
	f2.close();


[推荐]看雪工具下载站,全新登场!(Android、Web、漏洞分析还未更新)

上传的附件:
最新回复 (6)
mumaren 2011-8-21 22:40
2
0
等待附件ing
kisbuddy 2011-8-21 23:35
3
0
期待ing~
yxwsbobo 2011-8-22 12:43
4
0
写了个自动从头文件提取函数类型的飘过
kxtailaji 2011-8-22 12:49
5
0
日,一样                           ....
lhglhg 1 2011-8-22 13:01
6
0
学习了。。。
joeyye 2011-8-23 08:53
7
0
不错,要是把那个提取程序也共享就好了
游客
登录 | 注册 方可回帖
返回