From b5cb703f2e623edbbbb6dffd7dca99074064dd5c Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Tue, 28 Jul 2026 12:19:15 +0100 Subject: [PATCH] C++: Add tests with missing flow sources. --- .../dataflow/external-models/windows.cpp | 89 +++++++++++++++++++ 1 file changed, 89 insertions(+) diff --git a/cpp/ql/test/library-tests/dataflow/external-models/windows.cpp b/cpp/ql/test/library-tests/dataflow/external-models/windows.cpp index f098f7344e4..19ee57cd58b 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/windows.cpp +++ b/cpp/ql/test/library-tests/dataflow/external-models/windows.cpp @@ -940,4 +940,93 @@ void test_http_server_api(HANDLE hRequestQueue) { sink(certInfo.pCertEncoded); sink(*certInfo.pCertEncoded); // $ ir } +} + +using HKEY = void*; +using BYTE = unsigned char; +using LPBYTE = BYTE*; +using PLONG = LONG*; + +typedef struct value_entA { + LPSTR ve_valuename; + DWORD ve_valuelen; + DWORD_PTR ve_valueptr; + DWORD ve_type; +} VALENTA, *PVALENTA; + +typedef struct value_entW { + LPWSTR ve_valuename; + DWORD ve_valuelen; + DWORD_PTR ve_valueptr; + DWORD ve_type; +} VALENTW, *PVALENTW; + +LONG RegQueryValueA(HKEY hKey, LPCSTR lpSubKey, LPSTR lpData, PLONG lpcbData); +LONG RegQueryValueW(HKEY hKey, LPCWSTR lpSubKey, LPWSTR lpData, PLONG lpcbData); + +LONG RegQueryValueExA( + HKEY hKey, LPCSTR lpValueName, LPDWORD lpReserved, LPDWORD lpType, LPBYTE lpData, + LPDWORD lpcbData +); + +LONG RegQueryValueExW( + HKEY hKey, LPCWSTR lpValueName, LPDWORD lpReserved, LPDWORD lpType, LPBYTE lpData, + LPDWORD lpcbData +); + +LONG RegQueryMultipleValuesA( + HKEY hKey, PVALENTA valList, DWORD numVals, LPSTR valueBuffer, LPDWORD totalSize +); + +LONG RegQueryMultipleValuesW( + HKEY hKey, PVALENTW valList, DWORD numVals, LPWSTR valueBuffer, LPDWORD totalSize +); + +void test_registry_queries(HKEY hKey) { + { + char data[256]; + LONG dataSize = sizeof(data); + RegQueryValueA(hKey, "value", data, &dataSize); + sink(data); // clean + sink(*data); // $ MISSING: ir + } + { + wchar_t data[256]; + LONG dataSize = sizeof(data); + RegQueryValueW(hKey, L"value", data, &dataSize); + sink(data); // clean + sink(*data); // $ MISSING: ir + } + { + BYTE data[256]; + DWORD dataSize = sizeof(data); + DWORD type; + RegQueryValueExA(hKey, "value", nullptr, &type, data, &dataSize); + sink(data); // clean + sink(*data); // $ MISSING: ir + } + { + BYTE data[256]; + DWORD dataSize = sizeof(data); + DWORD type; + RegQueryValueExW(hKey, L"value", nullptr, &type, data, &dataSize); + sink(data); // clean + sink(*data); // $ MISSING: ir + } + { + VALENTA values[1]; + char data[256]; + DWORD dataSize = sizeof(data); + RegQueryMultipleValuesA(hKey, values, 1, data, &dataSize); + sink(data); // clean + sink(*data); // $ MISSING: ir + } + { + VALENTW values[1]; + wchar_t data[256]; + DWORD dataSize = sizeof(data); + RegQueryMultipleValuesW(hKey, values, 1, data, &dataSize); + sink(data); // clean + sink(*data); // $ MISSING: ir + } } \ No newline at end of file