@@ -335,3 +335,135 @@ void mapViewOfFile(HANDLE hMapFile) {
335335 sink (*buffer); // $ ir
336336 }
337337}
338+
339+ typedef struct _SECURITY_ATTRIBUTES
340+ {
341+ DWORD nLength;
342+ LPVOID lpSecurityDescriptor;
343+ BOOL bInheritHandle;
344+ } SECURITY_ATTRIBUTES, *PSECURITY_ATTRIBUTES, *LPSECURITY_ATTRIBUTES;
345+
346+ typedef DWORD (*LPTHREAD_START_ROUTINE)(
347+ LPVOID lpThreadParameter);
348+
349+ HANDLE CreateThread (
350+ LPSECURITY_ATTRIBUTES lpThreadAttributes,
351+ SIZE_T dwStackSize,
352+ LPTHREAD_START_ROUTINE lpStartAddress,
353+ LPVOID lpParameter,
354+ DWORD dwCreationFlags,
355+ LPDWORD lpThreadId);
356+
357+ HANDLE CreateRemoteThread (
358+ HANDLE hProcess,
359+ LPSECURITY_ATTRIBUTES lpThreadAttributes,
360+ SIZE_T dwStackSize,
361+ LPTHREAD_START_ROUTINE lpStartAddress,
362+ LPVOID lpParameter,
363+ DWORD dwCreationFlags,
364+ LPDWORD lpThreadId
365+ );
366+
367+ typedef ULONG_PTR DWORD_PTR;
368+
369+ typedef struct _PROC_THREAD_ATTRIBUTE_ENTRY
370+ {
371+ DWORD_PTR Attribute;
372+ SIZE_T cbSize;
373+ PVOID lpValue;
374+ } PROC_THREAD_ATTRIBUTE_ENTRY, *LPPROC_THREAD_ATTRIBUTE_ENTRY;
375+
376+ // This structure contains a list of attributes that have been added using UpdateProcThreadAttribute
377+ typedef struct _PROC_THREAD_ATTRIBUTE_LIST
378+ {
379+ DWORD dwFlags;
380+ ULONG Size;
381+ ULONG Count;
382+ ULONG Reserved;
383+ PULONG Unknown;
384+ PROC_THREAD_ATTRIBUTE_ENTRY Entries[1 ];
385+ } PROC_THREAD_ATTRIBUTE_LIST, *LPPROC_THREAD_ATTRIBUTE_LIST;
386+
387+ HANDLE CreateRemoteThreadEx (
388+ HANDLE hProcess,
389+ LPSECURITY_ATTRIBUTES lpThreadAttributes,
390+ SIZE_T dwStackSize,
391+ LPTHREAD_START_ROUTINE lpStartAddress,
392+ LPVOID lpParameter,
393+ DWORD dwCreationFlags,
394+ LPPROC_THREAD_ATTRIBUTE_LIST lpAttributeList,
395+ LPDWORD lpThreadId
396+ );
397+
398+ struct S
399+ {
400+ int x;
401+ };
402+
403+ DWORD ThreadProc1 (LPVOID lpParameter)
404+ {
405+ S *s = (S *)lpParameter;
406+ sink (s->x ); // $ MISSING: ir
407+ return 0 ;
408+ }
409+
410+ DWORD ThreadProc2 (LPVOID lpParameter)
411+ {
412+ S *s = (S *)lpParameter;
413+ sink (s->x ); // $ MISSING: ir
414+ return 0 ;
415+ }
416+
417+ DWORD ThreadProc3 (LPVOID lpParameter)
418+ {
419+ S *s = (S *)lpParameter;
420+ sink (s->x ); // $ MISSING: ir
421+ return 0 ;
422+ }
423+
424+ int source ();
425+
426+ void test_create_thread ()
427+ {
428+ SECURITY_ATTRIBUTES sa;
429+
430+ S s;
431+ s.x = source ();
432+
433+ {
434+ DWORD threadId;
435+ HANDLE threadHandle = CreateThread (
436+ &sa,
437+ 0 ,
438+ ThreadProc1,
439+ &s,
440+ 0 ,
441+ &threadId);
442+ }
443+
444+ {
445+ DWORD threadId;
446+ HANDLE threadHandle = CreateRemoteThread (
447+ nullptr ,
448+ &sa,
449+ 0 ,
450+ ThreadProc2,
451+ &s,
452+ 0 ,
453+ &threadId);
454+ }
455+
456+ {
457+ DWORD threadId;
458+ PROC_THREAD_ATTRIBUTE_LIST attrList;
459+ HANDLE threadHandle = CreateRemoteThreadEx (
460+ nullptr ,
461+ &sa,
462+ 0 ,
463+ ThreadProc3,
464+ &s,
465+ 0 ,
466+ &attrList,
467+ &threadId);
468+ }
469+ }
0 commit comments