При создании процесса вручную нужно уведомлять csrss. В старых примерах это делается так: CsrClientCallServer(&csrmsg, 0, 0x10000, 0x24); Последний параметр это размер структуры, он разный в разных версиях Windows. Во всех найденных примерах в csrmsg устанавливают всего четыре-пять полей, а остальное инициализируют нулями, и это работает. В Windows 7 x86 размер структуры 272 байта и если инициализировать их нулями, то процесс не регистрируется. Как наиболее легко разобраться в формате структуры и в том, чем её инициализировать для правильной регистрации процесса?
прототип Код (Text): typedef struct _PORT_MESSAGE { USHORT DataSize; USHORT MessageSize; USHORT MessageType; USHORT VirtualRangesOffset; CLIENT_ID ClientId; ULONG MessageId; ULONG SectionSize; // UCHAR Data[]; } PORT_MESSAGE, *PPORT_MESSAGE; typedef struct _CSR_CAPTURE_HEADER { ULONG Length; struct _CSR_CAPTURE_HEADER *RelatedCaptureBuffer; ULONG CountMessagePointers; PCHAR FreeSpace; ULONG_PTR MessagePointerOffsets[1]; // Offsets within CSR_API_MSG of pointers } CSR_CAPTURE_HEADER, *PCSR_CAPTURE_HEADER; typedef ULONG CSR_API_NUMBER; typedef struct _BASE_CREATETHREAD_MSG { HANDLE hThread; CLIENT_ID ClientId; }BASE_CREATETHREAD_MSG, *PBASE_CREATETHREAD_MSG; typedef struct _PBASE_CREATEPROCESS_MSG { HANDLE hProcess; HANDLE hThread; DWORD dwProcessId; DWORD dwThreadId; DWORD CreationFlags; CLIENT_ID DebuggerClientId; DWORD VdmBinaryType; }BASE_CREATEPROCESS_MSG ,*PBASE_CREATEPROCESS_MSG; typedef struct _BASE_API_MSG { PORT_MESSAGE PortMessage; PCSR_CAPTURE_HEADER CaptureBuffer; CSR_API_NUMBER ApiNumber; ULONG Status; ULONG Reserved; union { BASE_CREATETHREAD_MSG BaseCreateThread; BASE_CREATEPROCESS_MSG BaseCreateProcess; }u; }BASE_API_MSG,*PBASE_API_MSG; typedef struct _CSR_API_CONNECTINFO { OUT HANDLE ObjectDirectory; OUT PVOID SharedSectionBase; OUT PVOID SharedStaticServerData; OUT PVOID SharedSectionHeap; OUT ULONG DebugFlags; OUT ULONG SizeOfPebData; OUT ULONG SizeOfTebData; OUT ULONG NumberOfServerDllNames; OUT HANDLE ServerProcessId; } CSR_API_CONNECTINFO, *PCSR_API_CONNECTINFO; typedef struct _CSR_CLIENTCONNECT_MSG { IN ULONG ServerDllIndex; IN OUT PVOID ConnectionInformation; IN OUT ULONG ConnectionInformationLength; } CSR_CLIENTCONNECT_MSG, *PCSR_CLIENTCONNECT_MSG; typedef struct _CSR_API_MSG { PORT_MESSAGE h; union { CSR_API_CONNECTINFO ConnectionRequest; struct { PCSR_CAPTURE_HEADER CaptureBuffer; CSR_API_NUMBER ApiNumber; ULONG ReturnValue; ULONG Reserved; union { CSR_CLIENTCONNECT_MSG ClientConnect; ULONG_PTR ApiMessageData[39]; } u; }; }; } CSR_API_MSG, *PCSR_API_MSG; NTSYSAPI NTSTATUS NTAPI CsrClientCallServer( IN OUT PCSR_API_MSG m, IN OUT PCSR_CAPTURE_HEADER CaptureBuffer OPTIONAL, IN CSR_API_NUMBER ApiNumber, IN ULONG ArgLength ); уведомления потока делал так (работало xp\vista\seven) Код (Text): HANDLE hRemoteThread; CLIENT_ID ThreadClientId; NtStatus = NtCreateThread(&hRemoteThread,THREAD_ALL_ACCESS,&ObjectAttributes,hProcess,&ThreadClientId,&ThreadContext,&InitialTeb,TRUE); if (NT_SUCCESS(NtStatus)) { BASE_API_MSG BaseApiMsg; PBASE_CREATETHREAD_MSG pBaseCreateThread; MyZeroMemory(&BaseApiMsg,sizeof(BASE_API_MSG),0); pBaseCreateThread = (PBASE_CREATETHREAD_MSG)&BaseApiMsg.u.BaseCreateThread; pBaseCreateThread->hThread = hRemoteThread; pBaseCreateThread->ClientId = ThreadClientId; // inform client server subsystem of new thread in process NtStatus = CsrClientCallServer((PCSR_API_MSG)&BaseApiMsg,0,0x10001,0x0C); if (NT_SUCCESS(NtStatus)) { NtStatus = NtResumeThread(hRemoteThread,NULL); } NtClose(hRemoteThread); } уведомление для процесса Код (Text): BASE_API_MSG BaseApiMsg; PBASE_CREATEPROCESS_MSG pBaseCreateProcess=(PBASE_CREATEPROCESS_MSG)&BaseApiMsg.u.BaseCreateProcess; MyZeroMemory(&BaseApiMsg,sizeof(BASE_API_MSG),0); pBaseCreateProcess->hProcess = hProcess; pBaseCreateProcess->hThread =hThread; pBaseCreateProcess->dwProcessId = pid; pBaseCreateProcess->dwThreadId = tid; NtStatus = CsrClientCallServer((PCSR_API_MSG)&BaseApiMsg,0,0x10000,0x20); if(NT_SUCCESS(NtStatus)) { // ... ... ... }