Skip to content

Commit 5684ca5

Browse files
committed
C++: Add tests with 'CreateProcess' and fiends demonstrating missing flow.
1 parent d17c931 commit 5684ca5

File tree

1 file changed

+132
-0
lines changed
  • cpp/ql/test/library-tests/dataflow/external-models

1 file changed

+132
-0
lines changed

cpp/ql/test/library-tests/dataflow/external-models/windows.cpp

Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)