您的位置:首页 > 编程语言 > C语言/C++

建立一个不能打开的文件(占坑)---C语言高级API调用

2012-08-06 17:33 489 查看
建立一个不能打开的文件。当你看懂这段代码,就是一次质的改变。

源自 windows 核心编程 扩展...

#include <windows.h>

void RaiseToDebugP()
{
/*
GetCurrentProcessID 得到当前进程的ID
OpenProcessToken 得到进程的令牌句柄
LookupPrivilegeValue 查询进程的权限
AdjustTokenPrivileges 调整令牌权限
*/
HANDLE hToken;
HANDLE hProcess = GetCurrentProcess();
if ( OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken) )
{
TOKEN_PRIVILEGES tkp;
if ( LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tkp.Privileges[0].Luid) )
{
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
BOOL bREt = AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, NULL, 0) ;
}
CloseHandle(hToken);
}
}

int main()
{
BOOL    bRet;
LPCTSTR lpFileName ="c:\\auplicateHandle_Test.txt";

RaiseToDebugP();

HANDLE hProcess = OpenProcess( PROCESS_DUP_HANDLE, FALSE, 4);
// 微软公司窗口系统进程-- 4 为 system pid : 复制打开一个已经存在的进程对象
if ( hProcess == NULL )
{
hProcess = OpenProcess( PROCESS_DUP_HANDLE, FALSE, 8); // winOS-2K is 8
if ( hProcess == NULL )
return FALSE;
}

HANDLE hFile;
HANDLE hTargetHandle;
/* CreateFile是创建File这个内核对象,而不是创建物理磁盘上的“文件”。Win32 API中有一系列操作内核对象的函数,其大多命名为CreateXxx型。*/
hFile = CreateFile( lpFileName, GENERIC_READ, 0, NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL, NULL);
//0:表示不能共享 FILE_SHARE_READ FILE_SHARE_WRITE

if ( hFile == INVALID_HANDLE_VALUE )
{
CloseHandle( hProcess );
return FALSE;
}

bRet = DuplicateHandle( GetCurrentProcess(), hFile, hProcess, &hTargetHandle,
0, FALSE, DUPLICATE_SAME_ACCESS|DUPLICATE_CLOSE_SOURCE);

CloseHandle( hProcess );
return bRet;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐