Rebase against 053a7e225c8190fd7416b3f3c3186f1ac230eeb3

This commit is contained in:
Alistair Leslie-Hughes 2018-07-13 10:22:25 +10:00
parent fd81bd7755
commit 60e4f489f6
11 changed files with 18 additions and 720 deletions

View File

@ -1,380 +0,0 @@
From 4fc763b4564cf0dc7e9e27826d785255133c8187 Mon Sep 17 00:00:00 2001
From: Dmitry Timoshkov <dmitry@baikal.ru>
Date: Wed, 12 Apr 2017 13:59:20 +0800
Subject: advapi32: Add initial support for querying performance counters data.
(v2)
---
dlls/advapi32/registry.c | 244 ++++++++++++++++++++++++++++++++++++++++-
dlls/advapi32/tests/registry.c | 17 +--
2 files changed, 249 insertions(+), 12 deletions(-)
diff --git a/dlls/advapi32/registry.c b/dlls/advapi32/registry.c
index 7a26fffc55e..4dd29d3ba72 100644
--- a/dlls/advapi32/registry.c
+++ b/dlls/advapi32/registry.c
@@ -2,6 +2,7 @@
* Registry management
*
* Copyright (C) 1999 Alexandre Julliard
+ * Copyright (C) 2017 Dmitry Timoshkov
*
* Based on misc/registry.c code
* Copyright (C) 1996 Marcus Meissner
@@ -36,6 +37,7 @@
#include "winreg.h"
#include "winerror.h"
#include "winternl.h"
+#include "winperf.h"
#include "winuser.h"
#include "sddl.h"
#include "advapi32_misc.h"
@@ -1482,6 +1484,234 @@ LONG WINAPI RegSetKeyValueA( HKEY hkey, LPCSTR subkey, LPCSTR name, DWORD type,
return ret;
}
+struct perf_provider
+{
+ HMODULE perflib;
+ PM_OPEN_PROC *pOpen;
+ PM_CLOSE_PROC *pClose;
+ PM_COLLECT_PROC *pCollect;
+};
+
+static void *get_provider_entry(HKEY perf, HMODULE perflib, const char *name)
+{
+ char buf[MAX_PATH];
+ DWORD err, type, len;
+
+ len = sizeof(buf) - 1;
+ err = RegQueryValueExA(perf, name, NULL, &type, (BYTE *)buf, &len);
+ if (err != ERROR_SUCCESS || type != REG_SZ)
+ return NULL;
+
+ buf[len] = 0;
+ TRACE("Loading function pointer for %s: %s\n", name, debugstr_a(buf));
+
+ return GetProcAddress(perflib, buf);
+}
+
+static BOOL load_provider(HKEY root, const WCHAR *name, struct perf_provider *provider)
+{
+ static const WCHAR performanceW[] = { 'P','e','r','f','o','r','m','a','n','c','e',0 };
+ static const WCHAR libraryW[] = { 'L','i','b','r','a','r','y',0 };
+ WCHAR buf[MAX_PATH], buf2[MAX_PATH];
+ DWORD err, type, len;
+ HKEY service, perf;
+
+ err = RegOpenKeyExW(root, name, 0, KEY_READ, &service);
+ if (err != ERROR_SUCCESS)
+ return FALSE;
+
+ err = RegOpenKeyExW(service, performanceW, 0, KEY_READ, &perf);
+ RegCloseKey(service);
+ if (err != ERROR_SUCCESS)
+ return FALSE;
+
+ len = sizeof(buf) - sizeof(WCHAR);
+ err = RegQueryValueExW(perf, libraryW, NULL, &type, (BYTE *)buf, &len);
+ if (err != ERROR_SUCCESS || !(type == REG_SZ || type == REG_EXPAND_SZ))
+ goto error;
+
+ buf[len / sizeof(WCHAR)] = 0;
+ if (type == REG_EXPAND_SZ)
+ {
+ len = ExpandEnvironmentStringsW(buf, buf2, MAX_PATH);
+ if (!len || len > MAX_PATH) goto error;
+ strcpyW(buf, buf2);
+ }
+
+ if (!(provider->perflib = LoadLibraryW(buf)))
+ {
+ WARN("Failed to load %s\n", debugstr_w(buf));
+ goto error;
+ }
+
+ GetModuleFileNameW(provider->perflib, buf, MAX_PATH);
+ TRACE("Loaded provider %s\n", wine_dbgstr_w(buf));
+
+ provider->pOpen = get_provider_entry(perf, provider->perflib, "Open");
+ provider->pClose = get_provider_entry(perf, provider->perflib, "Close");
+ provider->pCollect = get_provider_entry(perf, provider->perflib, "Collect");
+ if (provider->pOpen && provider->pClose && provider->pCollect)
+ {
+ RegCloseKey(perf);
+ return TRUE;
+ }
+
+ TRACE("Provider is missing required exports\n");
+ FreeLibrary(provider->perflib);
+
+error:
+ RegCloseKey(perf);
+ return FALSE;
+}
+
+static DWORD collect_data(struct perf_provider *provider, const WCHAR *query, void **data, DWORD *size, DWORD *obj_count)
+{
+ DWORD err;
+
+ err = provider->pOpen(NULL);
+ if (err != ERROR_SUCCESS)
+ {
+ TRACE("Open error %u (%#x)\n", err, err);
+ return err;
+ }
+
+ *obj_count = 0;
+ err = provider->pCollect((WCHAR *)query, data, size, obj_count);
+ if (err != ERROR_SUCCESS)
+ {
+ TRACE("Collect error %u (%#x)\n", err, err);
+ *obj_count = 0;
+ }
+
+ provider->pClose();
+ return err;
+}
+
+#define MAX_SERVICE_NAME 260
+
+static DWORD query_perf_data(const WCHAR *query, DWORD *type, void *data, DWORD *ret_size)
+{
+ static const WCHAR SZ_SERVICES_KEY[] = { 'S','y','s','t','e','m','\\',
+ 'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\',
+ 'S','e','r','v','i','c','e','s',0 };
+ DWORD err, i, data_size;
+ HKEY root;
+ PERF_DATA_BLOCK *pdb;
+
+ if (!ret_size)
+ return ERROR_INVALID_PARAMETER;
+
+ data_size = *ret_size;
+ *ret_size = 0;
+
+ if (type)
+ *type = REG_BINARY;
+
+ if (!data || data_size < sizeof(*pdb))
+ return ERROR_MORE_DATA;
+
+ pdb = data;
+
+ pdb->Signature[0] = 'P';
+ pdb->Signature[1] = 'E';
+ pdb->Signature[2] = 'R';
+ pdb->Signature[3] = 'F';
+#ifdef WORDS_BIGENDIAN
+ pdb->LittleEndian = FALSE;
+#else
+ pdb->LittleEndian = TRUE;
+#endif
+ pdb->Version = PERF_DATA_VERSION;
+ pdb->Revision = PERF_DATA_REVISION;
+ pdb->TotalByteLength = 0;
+ pdb->HeaderLength = sizeof(*pdb);
+ pdb->NumObjectTypes = 0;
+ pdb->DefaultObject = 0;
+ QueryPerformanceCounter(&pdb->PerfTime);
+ QueryPerformanceFrequency(&pdb->PerfFreq);
+
+ data = pdb + 1;
+ pdb->SystemNameOffset = sizeof(*pdb);
+ pdb->SystemNameLength = (data_size - sizeof(*pdb)) / sizeof(WCHAR);
+ if (!GetComputerNameW(data, &pdb->SystemNameLength))
+ return ERROR_MORE_DATA;
+
+ pdb->SystemNameLength++;
+ pdb->SystemNameLength *= sizeof(WCHAR);
+
+ pdb->HeaderLength += pdb->SystemNameLength;
+
+ /* align to 8 bytes */
+ if (pdb->SystemNameLength & 7)
+ pdb->HeaderLength += 8 - (pdb->SystemNameLength & 7);
+
+ if (data_size < pdb->HeaderLength)
+ return ERROR_MORE_DATA;
+
+ pdb->TotalByteLength = pdb->HeaderLength;
+
+ data_size -= pdb->HeaderLength;
+ data = (char *)data + pdb->HeaderLength;
+
+ err = RegOpenKeyExW(HKEY_LOCAL_MACHINE, SZ_SERVICES_KEY, 0, KEY_READ, &root);
+ if (err != ERROR_SUCCESS)
+ return err;
+
+ i = 0;
+ for (;;)
+ {
+ DWORD collected_size = data_size, obj_count = 0;
+ struct perf_provider provider;
+ WCHAR name[MAX_SERVICE_NAME];
+ void *collected_data = data;
+
+ err = RegEnumKeyW(root, i++, name, MAX_SERVICE_NAME);
+ if (err == ERROR_NO_MORE_ITEMS)
+ {
+ err = ERROR_SUCCESS;
+ break;
+ }
+
+ if (err != ERROR_SUCCESS)
+ continue;
+
+ if (!load_provider(root, name, &provider))
+ continue;
+
+ err = collect_data(&provider, query, &collected_data, &collected_size, &obj_count);
+ FreeLibrary(provider.perflib);
+
+ if (err == ERROR_MORE_DATA)
+ break;
+
+ if (err == ERROR_SUCCESS)
+ {
+ PERF_OBJECT_TYPE *obj = (PERF_OBJECT_TYPE *)data;
+
+ TRACE("Collect: obj->TotalByteLength %u, collected_size %u\n",
+ obj->TotalByteLength, collected_size);
+
+ data_size -= collected_size;
+ data = collected_data;
+
+ pdb->TotalByteLength += collected_size;
+ pdb->NumObjectTypes += obj_count;
+ }
+ }
+
+ RegCloseKey(root);
+
+ if (err == ERROR_SUCCESS)
+ {
+ *ret_size = pdb->TotalByteLength;
+
+ GetSystemTime(&pdb->SystemTime);
+ GetSystemTimeAsFileTime((FILETIME *)&pdb->PerfTime100nSec);
+ }
+
+ return err;
+}
+
/******************************************************************************
* RegQueryValueExW [ADVAPI32.@]
*
@@ -1502,6 +1732,10 @@ LSTATUS WINAPI RegQueryValueExW( HKEY hkey, LPCWSTR name, LPDWORD reserved, LPDW
(count && data) ? *count : 0 );
if ((data && !count) || reserved) return ERROR_INVALID_PARAMETER;
+
+ if (hkey == HKEY_PERFORMANCE_DATA)
+ return query_perf_data(name, type, data, count);
+
if (!(hkey = get_special_root_hkey( hkey, 0 ))) return ERROR_INVALID_HANDLE;
RtlInitUnicodeString( &name_str, name );
@@ -1592,7 +1826,8 @@ LSTATUS WINAPI DECLSPEC_HOTPATCH RegQueryValueExA( HKEY hkey, LPCSTR name, LPDWO
hkey, debugstr_a(name), reserved, type, data, count, count ? *count : 0 );
if ((data && !count) || reserved) return ERROR_INVALID_PARAMETER;
- if (!(hkey = get_special_root_hkey( hkey, 0 ))) return ERROR_INVALID_HANDLE;
+ if (hkey != HKEY_PERFORMANCE_DATA && !(hkey = get_special_root_hkey( hkey, 0 )))
+ return ERROR_INVALID_HANDLE;
if (count) datalen = *count;
if (!data && count) *count = 0;
@@ -1604,6 +1839,13 @@ LSTATUS WINAPI DECLSPEC_HOTPATCH RegQueryValueExA( HKEY hkey, LPCSTR name, LPDWO
if ((status = RtlAnsiStringToUnicodeString( &nameW, &nameA, TRUE )))
return RtlNtStatusToDosError(status);
+ if (hkey == HKEY_PERFORMANCE_DATA)
+ {
+ DWORD ret = query_perf_data( nameW.Buffer, type, data, count );
+ RtlFreeUnicodeString( &nameW );
+ return ret;
+ }
+
status = NtQueryValueKey( hkey, &nameW, KeyValuePartialInformation,
buffer, sizeof(buffer), &total_size );
if (status && status != STATUS_BUFFER_OVERFLOW) goto done;
diff --git a/dlls/advapi32/tests/registry.c b/dlls/advapi32/tests/registry.c
index 43599359ac6..9706478a135 100644
--- a/dlls/advapi32/tests/registry.c
+++ b/dlls/advapi32/tests/registry.c
@@ -3520,10 +3520,10 @@ static void test_RegQueryValueExPerformanceData(void)
/* Test with data == NULL */
dwret = RegQueryValueExA( HKEY_PERFORMANCE_DATA, "Global", NULL, NULL, NULL, &cbData );
- todo_wine ok( dwret == ERROR_MORE_DATA, "expected ERROR_MORE_DATA, got %d\n", dwret );
+ ok( dwret == ERROR_MORE_DATA, "expected ERROR_MORE_DATA, got %d\n", dwret );
dwret = RegQueryValueExW( HKEY_PERFORMANCE_DATA, globalW, NULL, NULL, NULL, &cbData );
- todo_wine ok( dwret == ERROR_MORE_DATA, "expected ERROR_MORE_DATA, got %d\n", dwret );
+ ok( dwret == ERROR_MORE_DATA, "expected ERROR_MORE_DATA, got %d\n", dwret );
/* Test ERROR_MORE_DATA, start with small buffer */
len = 10;
@@ -3531,8 +3531,7 @@ static void test_RegQueryValueExPerformanceData(void)
cbData = len;
type = 0xdeadbeef;
dwret = RegQueryValueExA( HKEY_PERFORMANCE_DATA, "Global", NULL, &type, value, &cbData );
- todo_wine ok( dwret == ERROR_MORE_DATA, "expected ERROR_MORE_DATA, got %d\n", dwret );
-todo_wine
+ ok( dwret == ERROR_MORE_DATA, "expected ERROR_MORE_DATA, got %d\n", dwret );
ok(type == REG_BINARY, "got %u\n", type);
while( dwret == ERROR_MORE_DATA && limit)
{
@@ -3545,14 +3544,13 @@ todo_wine
}
ok(limit > 0, "too many times ERROR_MORE_DATA returned\n");
- todo_wine ok(dwret == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %d\n", dwret);
-todo_wine
+ ok(dwret == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %d\n", dwret);
ok(type == REG_BINARY, "got %u\n", type);
/* Check returned data */
if (dwret == ERROR_SUCCESS)
{
- todo_wine ok(len >= sizeof(PERF_DATA_BLOCK), "got size %d\n", len);
+ ok(len >= sizeof(PERF_DATA_BLOCK), "got size %d\n", len);
if (len >= sizeof(PERF_DATA_BLOCK)) {
pdb = (PERF_DATA_BLOCK*) value;
ok(pdb->Signature[0] == 'P', "expected Signature[0] = 'P', got 0x%x\n", pdb->Signature[0]);
@@ -3569,13 +3567,11 @@ todo_wine
{
cbData = 0xdeadbeef;
dwret = RegQueryValueExA(HKEY_PERFORMANCE_DATA, names[i], NULL, NULL, NULL, &cbData);
-todo_wine
ok(dwret == ERROR_MORE_DATA, "%u/%s: got %u\n", i, names[i], dwret);
ok(cbData == 0, "got %u\n", cbData);
cbData = 0;
dwret = RegQueryValueExA(HKEY_PERFORMANCE_DATA, names[i], NULL, NULL, NULL, &cbData);
-todo_wine
ok(dwret == ERROR_MORE_DATA, "%u/%s: got %u\n", i, names[i], dwret);
ok(cbData == 0, "got %u\n", cbData);
@@ -3608,9 +3604,7 @@ todo_wine
type = 0xdeadbeef;
cbData = sizeof(buf);
dwret = RegQueryValueExA(HKEY_PERFORMANCE_DATA, "invalid counter name", NULL, &type, buf, &cbData);
-todo_wine
ok(dwret == ERROR_SUCCESS, "got %u\n", dwret);
-todo_wine
ok(type == REG_BINARY, "got %u\n", type);
if (dwret == ERROR_SUCCESS)
{
@@ -3640,6 +3634,7 @@ todo_wine
ok(pdb->TotalByteLength == len, "got %u vs %u\n", pdb->TotalByteLength, len);
ok(pdb->HeaderLength == pdb->TotalByteLength, "got %u\n", pdb->HeaderLength);
ok(pdb->NumObjectTypes == 0, "got %u\n", pdb->NumObjectTypes);
+todo_wine
ok(pdb->DefaultObject != 0, "got %u\n", pdb->DefaultObject);
ok(pdb->SystemTime.wYear == st.wYear, "got %u\n", pdb->SystemTime.wYear);
ok(pdb->SystemTime.wMonth == st.wMonth, "got %u\n", pdb->SystemTime.wMonth);
--
2.13.1

View File

@ -1,93 +0,0 @@
From efdcec40d501c6b27e3f3460ad0ad5fe26643e9d Mon Sep 17 00:00:00 2001
From: Dmitry Timoshkov <dmitry@baikal.ru>
Date: Wed, 12 Apr 2017 15:04:03 +0800
Subject: winspool.drv: Add performance counters service stubs.
---
dlls/winspool.drv/info.c | 29 +++++++++++++++++++++++++++++
dlls/winspool.drv/winspool.drv.spec | 6 +++---
loader/wine.inf.in | 7 +++++++
3 files changed, 39 insertions(+), 3 deletions(-)
diff --git a/dlls/winspool.drv/info.c b/dlls/winspool.drv/info.c
index f09745d1e6b..330ce236b45 100644
--- a/dlls/winspool.drv/info.c
+++ b/dlls/winspool.drv/info.c
@@ -8681,3 +8681,32 @@ HRESULT WINAPI UploadPrinterDriverPackageW( LPCWSTR server, LPCWSTR path, LPCWST
flags, hwnd, dst, dstlen);
return E_NOTIMPL;
}
+
+/*****************************************************************************
+ * PerfOpen [WINSPOOL.@]
+ */
+DWORD WINAPI PerfOpen(LPWSTR context)
+{
+ FIXME("%s: stub\n", debugstr_w(context));
+ return ERROR_SUCCESS;
+}
+
+/*****************************************************************************
+ * PerfClose [WINSPOOL.@]
+ */
+DWORD WINAPI PerfClose(void)
+{
+ FIXME("stub\n");
+ return ERROR_SUCCESS;
+}
+
+/*****************************************************************************
+ * PerfCollect [WINSPOOL.@]
+ */
+DWORD WINAPI PerfCollect(LPWSTR query, LPVOID *data, LPDWORD size, LPDWORD obj_count)
+{
+ FIXME("%s,%p,%p,%p: stub\n", debugstr_w(query), data, size, obj_count);
+ *size = 0;
+ *obj_count = 0;
+ return ERROR_SUCCESS;
+}
diff --git a/dlls/winspool.drv/winspool.drv.spec b/dlls/winspool.drv/winspool.drv.spec
index 58dc60bcc9f..a23ea2ced99 100644
--- a/dlls/winspool.drv/winspool.drv.spec
+++ b/dlls/winspool.drv/winspool.drv.spec
@@ -2,9 +2,9 @@
101 stub -noname ClusterSplOpen
102 stub -noname ClusterSplClose
103 stub -noname ClusterSplIsAlive
-104 stub PerfClose
-105 stub PerfCollect
-106 stub PerfOpen
+104 stdcall PerfClose()
+105 stdcall PerfCollect(wstr ptr ptr ptr)
+106 stdcall PerfOpen(wstr)
201 stdcall GetDefaultPrinterA(ptr ptr)
202 stdcall SetDefaultPrinterA(str)
203 stdcall GetDefaultPrinterW(ptr ptr)
diff --git a/loader/wine.inf.in b/loader/wine.inf.in
index 176647b8beb..a83cc209a96 100644
--- a/loader/wine.inf.in
+++ b/loader/wine.inf.in
@@ -3353,6 +3353,7 @@ StartType=3
ErrorControl=1
[SpoolerService]
+AddReg=SpoolerServiceKeys
Description="Loads files to memory for later printing"
DisplayName="Print Spooler"
ServiceBinary="%11%\spoolsv.exe"
@@ -3361,6 +3362,12 @@ StartType=3
ErrorControl=1
LoadOrderGroup="SpoolerGroup"
+[SpoolerServiceKeys]
+HKLM,"System\CurrentControlSet\Services\Spooler\Performance","Library",,"winspool.drv"
+HKLM,"System\CurrentControlSet\Services\Spooler\Performance","Open",,"PerfOpen"
+HKLM,"System\CurrentControlSet\Services\Spooler\Performance","Close",,"PerfClose"
+HKLM,"System\CurrentControlSet\Services\Spooler\Performance","Collect",,"PerfCollect"
+
[TerminalServices]
Description="Remote desktop access"
DisplayName="Terminal Services"
--
2.13.1

View File

@ -1,72 +0,0 @@
From ea1f7f191b65313ed472e660a10d75e609a31dfc Mon Sep 17 00:00:00 2001
From: Dmitry Timoshkov <dmitry@baikal.ru>
Date: Fri, 14 Apr 2017 16:39:21 +0800
Subject: advapi32: Performance providers' Open() expects to see the configured
name as its parameter.
---
dlls/advapi32/registry.c | 23 +++++++++++++++++++++--
1 file changed, 21 insertions(+), 2 deletions(-)
diff --git a/dlls/advapi32/registry.c b/dlls/advapi32/registry.c
index a6e5c7903cf..37462380c40 100644
--- a/dlls/advapi32/registry.c
+++ b/dlls/advapi32/registry.c
@@ -1487,6 +1487,7 @@ LONG WINAPI RegSetKeyValueA( HKEY hkey, LPCSTR subkey, LPCSTR name, DWORD type,
struct perf_provider
{
HMODULE perflib;
+ WCHAR linkage[MAX_PATH];
PM_OPEN_PROC *pOpen;
PM_CLOSE_PROC *pClose;
PM_COLLECT_PROC *pCollect;
@@ -1512,6 +1513,8 @@ static BOOL load_provider(HKEY root, const WCHAR *name, struct perf_provider *pr
{
static const WCHAR performanceW[] = { 'P','e','r','f','o','r','m','a','n','c','e',0 };
static const WCHAR libraryW[] = { 'L','i','b','r','a','r','y',0 };
+ static const WCHAR linkageW[] = { 'L','i','n','k','a','g','e',0 };
+ static const WCHAR exportW[] = { 'E','x','p','o','r','t',0 };
WCHAR buf[MAX_PATH], buf2[MAX_PATH];
DWORD err, type, len;
HKEY service, perf;
@@ -1520,6 +1523,21 @@ static BOOL load_provider(HKEY root, const WCHAR *name, struct perf_provider *pr
if (err != ERROR_SUCCESS)
return FALSE;
+ provider->linkage[0] = 0;
+ err = RegOpenKeyExW(service, linkageW, 0, KEY_READ, &perf);
+ if (err == ERROR_SUCCESS)
+ {
+ len = sizeof(buf) - sizeof(WCHAR);
+ err = RegQueryValueExW(perf, exportW, NULL, &type, (BYTE *)buf, &len);
+ if (err == ERROR_SUCCESS && (type == REG_SZ || type == REG_MULTI_SZ))
+ {
+ memcpy(provider->linkage, buf, len);
+ provider->linkage[len / sizeof(WCHAR)] = 0;
+ TRACE("Export: %s\n", debugstr_w(provider->linkage));
+ }
+ RegCloseKey(perf);
+ }
+
err = RegOpenKeyExW(service, performanceW, 0, KEY_READ, &perf);
RegCloseKey(service);
if (err != ERROR_SUCCESS)
@@ -1563,12 +1581,13 @@ error:
static DWORD collect_data(struct perf_provider *provider, const WCHAR *query, void **data, DWORD *size, DWORD *obj_count)
{
+ WCHAR *linkage = provider->linkage[0] ? provider->linkage : NULL;
DWORD err;
- err = provider->pOpen(NULL);
+ err = provider->pOpen(linkage);
if (err != ERROR_SUCCESS)
{
- TRACE("Open error %u (%#x)\n", err, err);
+ TRACE("Open(%s) error %u (%#x)\n", debugstr_w(linkage), err, err);
return err;
}
--
2.13.1

View File

@ -1,31 +0,0 @@
From f734e1d94b068a78cc10600c190bb2d527ab4866 Mon Sep 17 00:00:00 2001
From: Dmitry Timoshkov <dmitry@baikal.ru>
Date: Fri, 14 Apr 2017 16:40:43 +0800
Subject: advapi32: If the query is not specified the default query is
"Global".
---
dlls/advapi32/registry.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/dlls/advapi32/registry.c b/dlls/advapi32/registry.c
index 37462380c40..0aa38c5b9b3 100644
--- a/dlls/advapi32/registry.c
+++ b/dlls/advapi32/registry.c
@@ -1581,9 +1581,13 @@ error:
static DWORD collect_data(struct perf_provider *provider, const WCHAR *query, void **data, DWORD *size, DWORD *obj_count)
{
+ static const WCHAR globalW[] = { 'G','l','o','b','a','l',0 };
WCHAR *linkage = provider->linkage[0] ? provider->linkage : NULL;
DWORD err;
+ if (!query || !query[0])
+ query = globalW;
+
err = provider->pOpen(linkage);
if (err != ERROR_SUCCESS)
{
--
2.13.1

View File

@ -1,53 +0,0 @@
From de80831314ecb76ac22b19b249467a600129a9e3 Mon Sep 17 00:00:00 2001
From: Dmitry Timoshkov <dmitry@baikal.ru>
Date: Fri, 14 Apr 2017 16:43:31 +0800
Subject: advapi32: Read the configured object list for the performance
provider.
FIXME: it's not currently used, but the queries should be matched
against the configured object lists, and the providers should be
loaded and called only in case of a match.
---
dlls/advapi32/registry.c | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/dlls/advapi32/registry.c b/dlls/advapi32/registry.c
index 0aa38c5b9b3..5af8128748b 100644
--- a/dlls/advapi32/registry.c
+++ b/dlls/advapi32/registry.c
@@ -1488,6 +1488,7 @@ struct perf_provider
{
HMODULE perflib;
WCHAR linkage[MAX_PATH];
+ WCHAR objects[MAX_PATH];
PM_OPEN_PROC *pOpen;
PM_CLOSE_PROC *pClose;
PM_COLLECT_PROC *pCollect;
@@ -1511,6 +1512,7 @@ static void *get_provider_entry(HKEY perf, HMODULE perflib, const char *name)
static BOOL load_provider(HKEY root, const WCHAR *name, struct perf_provider *provider)
{
+ static const WCHAR object_listW[] = { 'O','b','j','e','c','t',' ','L','i','s','t',0 };
static const WCHAR performanceW[] = { 'P','e','r','f','o','r','m','a','n','c','e',0 };
static const WCHAR libraryW[] = { 'L','i','b','r','a','r','y',0 };
static const WCHAR linkageW[] = { 'L','i','n','k','a','g','e',0 };
@@ -1543,6 +1545,16 @@ static BOOL load_provider(HKEY root, const WCHAR *name, struct perf_provider *pr
if (err != ERROR_SUCCESS)
return FALSE;
+ provider->objects[0] = 0;
+ len = sizeof(buf) - sizeof(WCHAR);
+ err = RegQueryValueExW(perf, object_listW, NULL, &type, (BYTE *)buf, &len);
+ if (err == ERROR_SUCCESS && (type == REG_SZ || type == REG_MULTI_SZ))
+ {
+ memcpy(provider->objects, buf, len);
+ provider->objects[len / sizeof(WCHAR)] = 0;
+ TRACE("Object List: %s\n", debugstr_w(provider->objects));
+ }
+
len = sizeof(buf) - sizeof(WCHAR);
err = RegQueryValueExW(perf, libraryW, NULL, &type, (BYTE *)buf, &len);
if (err != ERROR_SUCCESS || !(type == REG_SZ || type == REG_EXPAND_SZ))
--
2.13.1

View File

@ -1 +0,0 @@
Fixes: [33037] Add support for querying performance counters data

View File

@ -52,13 +52,13 @@ usage()
# Get the upstream commit sha
upstream_commit()
{
echo "acb879c9d2feae69e8b5b1ede28523a29aef1b89"
echo "053a7e225c8190fd7416b3f3c3186f1ac230eeb3"
}
# Show version information
version()
{
echo "Wine Staging 3.12"
echo "Wine Staging 3.13 (Unreleased)"
echo "Copyright (C) 2014-2018 the Wine Staging project authors."
echo "Copyright (C) 2018 Alistair Leslie-Hughes"
echo ""
@ -89,7 +89,6 @@ patch_enable_all ()
enable_advapi32_CreateRestrictedToken="$1"
enable_advapi32_LsaLookupPrivilegeName="$1"
enable_advapi32_LsaLookupSids="$1"
enable_advapi32_Performance_Counters="$1"
enable_advapi32_SetSecurityInfo="$1"
enable_advapi32_Token_Integrity_Level="$1"
enable_advapi32_WinBuiltinAnyPackageSid="$1"
@ -318,7 +317,6 @@ patch_enable_all ()
enable_stdole32_tlb_SLTG_Typelib="$1"
enable_taskmgr_Memory_Usage="$1"
enable_uianimation_stubs="$1"
enable_user_exe16_DlgDirList="$1"
enable_user32_Auto_Radio_Button="$1"
enable_user32_Combobox_WM_SIZE="$1"
enable_user32_DM_SETDEFID="$1"
@ -442,9 +440,6 @@ patch_enable ()
advapi32-LsaLookupSids)
enable_advapi32_LsaLookupSids="$2"
;;
advapi32-Performance_Counters)
enable_advapi32_Performance_Counters="$2"
;;
advapi32-SetSecurityInfo)
enable_advapi32_SetSecurityInfo="$2"
;;
@ -1129,9 +1124,6 @@ patch_enable ()
uianimation-stubs)
enable_uianimation_stubs="$2"
;;
user.exe16-DlgDirList)
enable_user_exe16_DlgDirList="$2"
;;
user32-Auto_Radio_Button)
enable_user32_Auto_Radio_Button="$2"
;;
@ -2494,30 +2486,6 @@ if test "$enable_advapi32_LsaLookupSids" -eq 1; then
) >> "$patchlist"
fi
# Patchset advapi32-Performance_Counters
# |
# | This patchset fixes the following Wine bugs:
# | * [#33037] Add support for querying performance counters data
# |
# | Modified files:
# | * dlls/advapi32/registry.c, dlls/advapi32/tests/registry.c, dlls/winspool.drv/info.c, dlls/winspool.drv/winspool.drv.spec,
# | loader/wine.inf.in
# |
if test "$enable_advapi32_Performance_Counters" -eq 1; then
patch_apply advapi32-Performance_Counters/0003-advapi32-Add-initial-support-for-querying-performanc.patch
patch_apply advapi32-Performance_Counters/0004-winspool.drv-Add-performance-counters-service-stubs.patch
patch_apply advapi32-Performance_Counters/0005-advapi32-Performance-providers-Open-expects-to-see-t.patch
patch_apply advapi32-Performance_Counters/0006-advapi32-If-the-query-is-not-specified-the-default-q.patch
patch_apply advapi32-Performance_Counters/0007-advapi32-Read-the-configured-object-list-for-the-per.patch
(
printf '%s\n' '+ { "Dmitry Timoshkov", "advapi32: Add initial support for querying performance counters data.", 2 },';
printf '%s\n' '+ { "Dmitry Timoshkov", "winspool.drv: Add performance counters service stubs.", 1 },';
printf '%s\n' '+ { "Dmitry Timoshkov", "advapi32: Performance providers'\'' Open() expects to see the configured name as its parameter.", 1 },';
printf '%s\n' '+ { "Dmitry Timoshkov", "advapi32: If the query is not specified the default query is \"Global\".", 1 },';
printf '%s\n' '+ { "Dmitry Timoshkov", "advapi32: Read the configured object list for the performance provider.", 1 },';
) >> "$patchlist"
fi
# Patchset advapi32-SetSecurityInfo
# |
# | This patchset fixes the following Wine bugs:
@ -6634,21 +6602,6 @@ if test "$enable_uianimation_stubs" -eq 1; then
) >> "$patchlist"
fi
# Patchset user.exe16-DlgDirList
# |
# | This patchset fixes the following Wine bugs:
# | * [#18734] Fix handling of DDL_DRIVES flag in user.exe16.DlgDirList
# |
# | Modified files:
# | * dlls/user.exe16/dialog.c
# |
if test "$enable_user_exe16_DlgDirList" -eq 1; then
patch_apply user.exe16-DlgDirList/0001-user.exe16-Fix-handling-of-DDL_DRIVES-flag-in-DlgDir.patch
(
printf '%s\n' '+ { "Alex Villacís Lasso", "user.exe16: Fix handling of DDL_DRIVES flag in DlgDirList.", 1 },';
) >> "$patchlist"
fi
# Patchset user32-Auto_Radio_Button
# |
# | This patchset fixes the following Wine bugs:

View File

@ -1,7 +1,8 @@
From c157e1ed4e1a3f373471bb49f1a8c536ea0ce2cc Mon Sep 17 00:00:00 2001
From f3f0a7694d6b6d130f569cad2f7ffc0681d9c425 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Michael=20M=C3=BCller?= <michael@fds-team.de>
Date: Wed, 8 Mar 2017 19:39:29 +0100
Subject: ntdll: Mimic object type behavior for different windows versions.
Subject: [PATCH] ntdll: Mimic object type behavior for different windows
versions.
---
dlls/ntdll/nt.c | 17 ++++++++++++--
@ -10,12 +11,12 @@ Subject: ntdll: Mimic object type behavior for different windows versions.
3 files changed, 83 insertions(+), 4 deletions(-)
diff --git a/dlls/ntdll/nt.c b/dlls/ntdll/nt.c
index 211b67f98b..1dd890c4bd 100644
index b382a48..f059c9f 100644
--- a/dlls/ntdll/nt.c
+++ b/dlls/ntdll/nt.c
@@ -70,6 +70,19 @@
WINE_DEFAULT_DEBUG_CHANNEL(ntdll);
@@ -127,6 +127,19 @@ struct smbios_chassis {
#define FIRM 0x4649524D
#define RSMB 0x52534D42
+static DWORD translate_object_index(DWORD index)
+{
@ -33,7 +34,7 @@ index 211b67f98b..1dd890c4bd 100644
/*
* Token
*/
@@ -2280,7 +2293,7 @@ NTSTATUS WINAPI NtQuerySystemInformation(
@@ -2645,7 +2658,7 @@ NTSTATUS WINAPI NtQuerySystemInformation(
shi->Handle[i].OwnerPid = info[i].owner;
shi->Handle[i].HandleValue = info[i].handle;
shi->Handle[i].AccessMask = info[i].access;
@ -42,7 +43,7 @@ index 211b67f98b..1dd890c4bd 100644
/* FIXME: Fill out HandleFlags, ObjectPointer */
}
}
@@ -2332,7 +2345,7 @@ NTSTATUS WINAPI NtQuerySystemInformation(
@@ -2697,7 +2710,7 @@ NTSTATUS WINAPI NtQuerySystemInformation(
shi->Handle[i].UniqueProcessId = info[i].owner;
shi->Handle[i].HandleValue = info[i].handle;
shi->Handle[i].GrantedAccess = info[i].access;
@ -52,7 +53,7 @@ index 211b67f98b..1dd890c4bd 100644
}
}
diff --git a/dlls/ntdll/om.c b/dlls/ntdll/om.c
index 8f54d4f49f..92fc654448 100644
index 629f785..060b502 100644
--- a/dlls/ntdll/om.c
+++ b/dlls/ntdll/om.c
@@ -186,7 +186,10 @@ NTSTATUS WINAPI NtQueryObject(IN HANDLE handle,
@ -68,7 +69,7 @@ index 8f54d4f49f..92fc654448 100644
}
}
diff --git a/dlls/ntdll/tests/om.c b/dlls/ntdll/tests/om.c
index 02d83016e2..84b783b80a 100644
index efe7d3b..be137b8 100644
--- a/dlls/ntdll/tests/om.c
+++ b/dlls/ntdll/tests/om.c
@@ -69,6 +69,7 @@ static NTSTATUS (WINAPI *pNtWaitForKeyedEvent)( HANDLE, const void *, BOOLEAN, c
@ -79,7 +80,7 @@ index 02d83016e2..84b783b80a 100644
#define KEYEDEVENT_WAIT 0x0001
#define KEYEDEVENT_WAKE 0x0002
@@ -1539,13 +1540,31 @@ static void test_query_object(void)
@@ -1542,13 +1543,31 @@ static void test_query_object(void)
pRtlFreeUnicodeString( &session );
}
@ -112,7 +113,7 @@ index 02d83016e2..84b783b80a 100644
buffer = HeapAlloc( GetProcessHeap(), 0, sizeof(OBJECT_TYPES_INFORMATION) );
ok( buffer != NULL, "Failed to allocate memory\n" );
@@ -1573,11 +1592,54 @@ static void test_query_object_types(void)
@@ -1576,11 +1595,54 @@ static void test_query_object_types(void)
ok( type->TypeName.Length == sizeof(typeW) && !strncmpW(typeW, type->TypeName.Buffer, 4),
"Expected 'Type' as first type, got %s\n", wine_dbgstr_us(&type->TypeName) );
}
@ -167,7 +168,7 @@ index 02d83016e2..84b783b80a 100644
}
static void test_type_mismatch(void)
@@ -2084,6 +2146,7 @@ START_TEST(om)
@@ -2087,6 +2149,7 @@ START_TEST(om)
pNtReleaseKeyedEvent = (void *)GetProcAddress(hntdll, "NtReleaseKeyedEvent");
pNtCreateIoCompletion = (void *)GetProcAddress(hntdll, "NtCreateIoCompletion");
pNtOpenIoCompletion = (void *)GetProcAddress(hntdll, "NtOpenIoCompletion");
@ -176,5 +177,5 @@ index 02d83016e2..84b783b80a 100644
test_case_sensitive();
test_namespace_pipe();
--
2.11.0
1.9.1

View File

@ -1,25 +0,0 @@
From ec7c2cf03581d8b1c43bc87cba8f190165a3cc02 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Alex=20Villac=C3=ADs=20Lasso?= <a_villacis@palosanto.com>
Date: Sun, 31 May 2009 22:53:00 -0500
Subject: user.exe16: Fix handling of DDL_DRIVES flag in DlgDirList.
---
dlls/user.exe16/dialog.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/dlls/user.exe16/dialog.c b/dlls/user.exe16/dialog.c
index fead42d..ce17ed8 100644
--- a/dlls/user.exe16/dialog.c
+++ b/dlls/user.exe16/dialog.c
@@ -636,7 +636,7 @@ INT16 WINAPI DlgDirList16( HWND16 hDlg, LPSTR spec, INT16 idLBox,
* be set automatically (this is different in Win32, and
* DIALOG_DlgDirList sends Win32 messages to the control,
* so do it here) */
- if (attrib & DDL_DRIVES) attrib |= DDL_EXCLUSIVE;
+ if (attrib == DDL_DRIVES) attrib |= DDL_EXCLUSIVE;
return DlgDirListA( WIN_Handle32(hDlg), spec, idLBox, idStatic, attrib );
}
--
2.7.1

View File

@ -1 +0,0 @@
Fixes: [18734] Fix handling of DDL_DRIVES flag in user.exe16.DlgDirList

View File

@ -1 +1 @@
Wine Staging 3.12
Wine Staging 3.13 (Unreleased)