@@ -335,3 +335,135 @@ void mapViewOfFile(HANDLE hMapFile) {
335
335
sink (*buffer); // $ ir
336
336
}
337
337
}
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