关于ThreadProc Callback Function的一点误会及自我更正

 
分类: Windows SDK 408人阅读 评论(0) 收藏 举报

MSDN原文:

1:CreateRemoteThread

HANDLE WINAPI CreateRemoteThread(
  __in          HANDLE hProcess,
  __in          LPSECURITY_ATTRIBUTES lpThreadAttributes,
  __in          SIZE_T dwStackSize,
  __in          LPTHREAD_START_ROUTINE lpStartAddress,
  __in          LPVOID lpParameter,
  __in          DWORD dwCreationFlags,
  __out         LPDWORD lpThreadId
);

lpParameter

A pointer to a variable to be passed to the thread function.(不知道是我E文太烂还是什么)

 

这个lpParameter 的确不咋地,它让我误解了,我的错误理解:

这个lpParameter是指向你所要传给ThreadProc的参数的指针了!!

 

2:ThreadProc
An application-defined function that serves as the starting address for a thread.

Specify this address when calling the CreateThread or CreateRemoteThread function

The LPTHREAD_START_ROUTINE type defines a pointer to this callback function. ThreadProc is a placeholder for the application-defined function name.


 DWORD WINAPI ThreadProc(
  [in]                 LPVOID lpParameter   );

lpParameter

The thread data passed to the function using the lpParameter parameter of the CreateThread or CreateRemoteThread function.(这句解释道出了真谛,)

这两个API中的 LPVOID lpParameter  其实只是个LPVOID大小的一个参数而已,(
所以我觉得如下声明更好一些:


 [in]                 DWORD dwParam 

 

也就说我在调用CreateRemoteThread时传给它的参数就是ThreadProc收到的参数

 

当然你自己可以把它解析成一个指针!!这在需要传递更大、更多的参数时是必须的!

 

 

我的误解导致了我几个小时没有调通我的程序:

BOOL WINAPI FreeLibrary(
  __in          HMODULE hModule
);
我需要在远程进程的中新建线程调用FreeLibrary卸掉一个DLL

我通过LoadLibrary、GetModuleHandle成功得到该DLL的句柄之后,

我一直在尝试用VirtualAllocEx、WriteProcessMemory把这个值写到远程地址空间。。。。

其实大可不必,正确的方法:

::CreateRemoteThread( m_hProcess, 0, 0, (LPTHREAD_START_ROUTINE)..(FreeLibrary的地址), hModule, 0, 0);

就万事大吉了!!!!

而我饶了好大一圈不说,还绕错了!!!

汗死了!!!

你可能感兴趣的:(thread,windows,function,dll,sdk,callback,attributes,winapi)