2 * PROJECT: ReactOS Local Spooler
3 * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4 * PURPOSE: Various tools
5 * COPYRIGHT: Copyright 2015-2017 Colin Finck (colin@reactos.org)
11 * @name AllocAndRegQueryWSZ
13 * Queries a REG_SZ value in the registry, allocates memory for it and returns a buffer containing the value.
14 * You have to free this buffer using DllFreeSplMem.
17 * HKEY variable of the key opened with RegOpenKeyExW.
19 * @param pwszValueName
20 * Name of the REG_SZ value to query.
23 * Pointer to the buffer containing the value or NULL in case of failure.
26 AllocAndRegQueryWSZ(HKEY hKey
, PCWSTR pwszValueName
)
32 // Determine the size of the required buffer.
33 lStatus
= RegQueryValueExW(hKey
, pwszValueName
, NULL
, NULL
, NULL
, &cbNeeded
);
34 if (lStatus
!= ERROR_SUCCESS
)
36 ERR("RegQueryValueExW failed with status %ld!\n", lStatus
);
41 pwszValue
= DllAllocSplMem(cbNeeded
);
44 ERR("DllAllocSplMem failed!\n");
48 // Now get the actual value.
49 lStatus
= RegQueryValueExW(hKey
, pwszValueName
, NULL
, NULL
, (PBYTE
)pwszValue
, &cbNeeded
);
50 if (lStatus
!= ERROR_SUCCESS
)
52 ERR("RegQueryValueExW failed with status %ld!\n", lStatus
);
53 DllFreeSplMem(pwszValue
);
61 DuplicateDevMode(PDEVMODEW pInput
)
65 // Allocate a buffer for this DevMode.
66 pOutput
= DllAllocSplMem(pInput
->dmSize
+ pInput
->dmDriverExtra
);
69 ERR("DllAllocSplMem failed!\n");
74 CopyMemory(pOutput
, pInput
, pInput
->dmSize
+ pInput
->dmDriverExtra
);
79 /******************************************************************
80 * copy_servername_from_name (internal)
82 * for an external server, the serverpart from the name is copied.
85 * the length (in WCHAR) of the serverpart (0 for the local computer)
86 * (-length), when the name is too long
89 LONG
copy_servername_from_name(LPCWSTR name
, LPWSTR target
)
93 WCHAR buffer
[MAX_COMPUTERNAME_LENGTH
+1];
97 if (target
) *target
= '\0';
99 if (name
== NULL
) return 0;
100 if ((name
[0] != '\\') || (name
[1] != '\\')) return 0;
103 /* skip over both backslash, find separator '\' */
104 ptr
= wcschr(server
, '\\');
105 serverlen
= (ptr
) ? ptr
- server
: lstrlenW(server
);
107 /* servername is empty */
108 if (serverlen
== 0) return 0;
110 FIXME("found %s\n", debugstr_wn(server
, serverlen
));
112 if (serverlen
> MAX_COMPUTERNAME_LENGTH
) return -(LONG
)serverlen
;
116 memcpy(target
, server
, serverlen
* sizeof(WCHAR
));
117 target
[serverlen
] = '\0';
120 len
= ARRAYSIZE(buffer
);
121 if (GetComputerNameW(buffer
, &len
))
123 if ((serverlen
== len
) && (_wcsnicmp(server
, buffer
, len
) == 0))
125 /* The requested Servername is our computername */