线程远程注入的有关问题

线程远程注入的问题
从网上找了篇代码改了改
function   Main(dwEntryPoint:   Pointer):   longword;   stdcall;//程序入口,注入后执行的代码
begin
//添加执行的程序
Result   :=   0;
end;

procedure   Inject(ProcessHandle:   longword;   EntryPoint:   pointer);
var
Module,   NewModule:   Pointer;
Size,   BytesWritten,   TID:   longword;
begin
Module   :=   Pointer(GetModuleHandle(nil));
Size   :=   PImageOptionalHeader(Pointer(integer(Module)   +   PImageDosHeader(Module)._lfanew   +   SizeOf(dword)   +   SizeOf(TImageFileHeader))).SizeOfImage;
VirtualFreeEx(ProcessHandle,   Module,   0,   MEM_RELEASE);
NewModule   :=   VirtualAllocEx(ProcessHandle,   Module,   Size,   MEM_COMMIT   or   MEM_RESERVE,   PAGE_EXECUTE_READWRITE);
WriteProcessMemory(ProcessHandle,   NewModule,   Module,   Size,   BytesWritten);
CreateRemoteThread(ProcessHandle,   nil,   0,   EntryPoint,   Module,   0,   TID);
end;
//
procedure   TForm1.Button1Click(Sender:   TObject);
var
ProcessHandle,   PID:   longword;
fid:thandle;
begin
GetWindowThreadProcessId(FindWindow( 'Shell_TrayWnd ',   nil),   @PID);//获取
ProcessHandle   :=   OpenProcess(PROCESS_ALL_ACCESS,   False,   PID);//打开进程
Inject(ProcessHandle,   @Main);//插入代码
CloseHandle(ProcessHandle);//关闭线程句柄
end;
怎么一执行就有错误,把explore.exe都关了
那里有错误啊?

------解决方案--------------------
好像是那个不用 DLL 的 HOOK