请教个内核对象句柄继承的问题

shiweifu 2010-05-29 09:02:20
按照《WINDOWS核心编程》中的说法,把父进程中打开的内核对象句柄设置成可继承的
然后在子进程中写入字符串,之后释放

上代码:

先贴子进程的:


int main(int argc, char* argv[])
{
int n = 0;
HANDLE hFile = (HANDLE)argv[1];
/*if (argc != 2)
{
puts("caller.exe filename");
}*/

puts("i'm called");
// hFile = CreateFile("abc",GENERIC_WRITE,FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);


//szFileName = (HANDLE)argv[1];
// Creat


Sleep(5000);
BOOL b = WriteFile(hFile,"hello world",12,(unsigned long *)&n,NULL);
CloseHandle(hFile);
DWORD d = GetLastError();



printf("%d\r\n",d);
//printf("Hello World!\n");
printf("%x\r\n",hFile);
return 0;
}



再来父进程的:

int _tmain(int argc, _TCHAR* argv[])
{

// char buff[MAX_BUFF];
// char buff[256];
HANDLE hFile;

//安全属性
SECURITY_ATTRIBUTES fSa;
ZeroMemory(&fSa,sizeof(fSa));
fSa.nLength = sizeof(fSa);
fSa.bInheritHandle = TRUE;
fSa.lpSecurityDescriptor = NULL;
char pline[sizeof(HANDLE)];




//创建文件句柄
hFile = CreateFileA("c:\\test",GENERIC_WRITE,FILE_SHARE_WRITE,&fSa,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
DWORD n = GetLastError();
if(n != 0)
{
puts("CreateFile Error");
exit(-1);
}

sprintf(pline," %x",hFile);
// strcat(chPath,path);

//启动信息
STARTUPINFOA si;

//子进程信息
PROCESS_INFORMATION pi;

//清空
ZeroMemory( &pi, sizeof(pi) );
ZeroMemory( &si, sizeof(si) );

si.cb = sizeof(si);

// Start the child process

// if(CreateProcessA("D:\\source\\kernel_obj\\app1\\called\Debug\\called.exe",NULL , NULL, &fSa, TRUE, 0, NULL, NULL, &si, &pi))
if(CreateProcessA("D:\\called.exe",pline ,&fSa,NULL, TRUE, 0, NULL, NULL, &si, &pi))

{

//按键之后再释放
getchar();
//Sleep(5000);
TerminateProcess(pi.hProcess,0);


CloseHandle( pi.hProcess );

CloseHandle( pi.hThread );

}

else

{

CloseHandle(hFile);
MessageBox(NULL,_T("创建失败!"),NULL,MB_OK);

HANDLE hProcess = GetCurrentProcess();//get current process

TerminateProcess(hProcess,0); //close process

}
//free(wBuf);
CloseHandle(hFile);
// Sleep(5000);

return 0;
}




无法写入文件。。求教
...全文
145 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
不说害怕 2010-05-31
  • 打赏
  • 举报
回复
HANDLE hFile = (HANDLE)argv[1];

这个地方要把字符串转换成HANDLE
Eleven 2010-05-31
  • 打赏
  • 举报
回复
please debug first before you have problem
lishaoyu 2010-05-31
  • 打赏
  • 举报
回复
1. char pline[sizeof(HANDLE)];
sprintf(pline," %x",hFile);
多了个空格把空格
2. 然后
char* testr;
HANDLE hFile =(void*)strtol(argv[1],&tertr,16);
就可以用这个继承下来的文件句柄了。祝你成功!
weiym 2010-05-29
  • 打赏
  • 举报
回复
LZ边学习边实践,精神可嘉.

帮LZ调试了下,修改这2个错误就可以了.
1. char pline[sizeof(HANDLE)];
sprintf(pline," %x",hFile);
这里多了个空格, 缓冲越界了,这样改
sprintf(pline,"%u",hFile);

2. 就是上面说的问题,index应该是0, 传入参数是字符串,要转成句柄:
HANDLE hFile = (HANDLE)atoi(argv[0]);//HANDLE hFile = (HANDLE)argv[1];

songxuning1986 2010-05-29
  • 打赏
  • 举报
回复
tong tong
yangyang__ 2010-05-29
  • 打赏
  • 举报
回复
首先在父进程中,文件句柄是转换成字符串后传到子进程中去的,那么到了子进程中,它就是一个字符串,需要将其再转换成整数才能使用.在父进程中是用16进制转化的,子进程也用16进制转化回来.
再一个就是你在父进程的这种给子进程传递参数的方式,要得到pline指向的字符串,在子进程中要使用argv[0]而不是argv[1].你可以试试.
schlafenhamster 2010-05-29
  • 打赏
  • 举报
回复
使用GetStdHandle()
shiweifu 2010-05-29
  • 打赏
  • 举报
回复
按照书上说的,进程中维护了一个句柄表。
在设置了权限属性之后,子进程继承了父进程的句柄表,他们其中所在的内存地址是相同的。

也就是说是可以访问的,我觉得可能是这么传值不对

书中给出的继承方式有两种:
1、通过启动参数
2、通过环境变量

我觉得貌似是指的不对,该弄sprintf赋值?
red-fly 2010-05-29
  • 打赏
  • 举报
回复
我没有做过,不过我看你的程序也不对。在子进程中,

HANDLE hFile = (HANDLE)argv[1];

是如何来的?argv[1]怎么可能刚好就是父进程中的HANDLE hFile;?
shiweifu 2010-05-29
  • 打赏
  • 举报
回复
UPUPUPUP

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧