On 2017-05-22 03:09, hbelusca(a)svn.reactos.org wrote:
---
branches/setup_improvements/base/setup/lib/arcname.c (added)
+++ branches/setup_improvements/base/setup/lib/arcname.c [iso-8859-1] Mon May 22 01:09:35
2017
+PCSTR
+ArcGetNextTokenA(
+ IN PCSTR ArcPath,
+ OUT PANSI_STRING TokenSpecifier,
+ OUT PULONG Key)
+{
+ HRESULT hr;
+ PCSTR p = ArcPath;
+ ULONG SpecifierLength;
+ ULONG KeyValue;
+
+ /*
+ * We must have a valid "specifier(key)" string, where
'specifier'
+ * cannot be the empty string, and is followed by '('.
+ */
+ p = strchr(p, '(');
+ if (p == NULL)
+ return NULL; /* No '(' found */
+ if (p == ArcPath)
+ return NULL; /* Path starts with '(' and is thus invalid */
+
+ SpecifierLength = (p - ArcPath) * sizeof(CHAR);
+
+ /*
+ * The strtoul function skips any leading whitespace.
+ *
+ * Note that if the token is "specifier()" then strtoul won't perform
+ * any conversion and return 0, therefore effectively making the token
+ * equivalent to "specifier(0)", as it should be.
+ */
+ // KeyValue = atoi(p);
+ KeyValue = strtoul(p, (PSTR*)&p, 10);
+
+ /* Skip any trailing whitespace */
+ while (*p && isspace(*p)) ++p;
isspace(0) is false so you don't need the *p check.
+PCWSTR
+ArcGetNextTokenU(
+ IN PCWSTR ArcPath,
+ OUT PUNICODE_STRING TokenSpecifier,
+ OUT PULONG Key)
+{
+ HRESULT hr;
+ PCWSTR p = ArcPath;
+ ULONG SpecifierLength;
+ ULONG KeyValue;
+
+ /*
+ * We must have a valid "specifier(key)" string, where
'specifier'
+ * cannot be the empty string, and is followed by '('.
+ */
+ p = wcschr(p, L'(');
+ if (p == NULL)
+ return NULL; /* No '(' found */
+ if (p == ArcPath)
+ return NULL; /* Path starts with '(' and is thus invalid */
+
+ SpecifierLength = (p - ArcPath) * sizeof(WCHAR);
+
+ ++p;
+
+ /*
+ * The strtoul function skips any leading whitespace.
+ *
+ * Note that if the token is "specifier()" then strtoul won't perform
+ * any conversion and return 0, therefore effectively making the token
+ * equivalent to "specifier(0)", as it should be.
+ */
+ // KeyValue = _wtoi(p);
+ KeyValue = wcstoul(p, (PWSTR*)&p, 10);
+ ASSERT(p);
This assert seems superfluous, you just dereferenced the pointer. Also,
you incremented it just above and also (rightly) assumed it was larger
than ArcPath.
+static NTSTATUS
+ResolveArcNameManually(
+ OUT PUNICODE_STRING NtName,
+ IN OUT PCWSTR* ArcNamePath,
+ IN PPARTLIST PartList OPTIONAL)
+{
[...]
+Quit:
+ if (FAILED(hr))
+ {
+ /*
+ * We can directly cast the HRESULTs into NTSTATUS since the error codes
+ * returned by StringCbPrintfW:
+ * STRSAFE_E_INVALID_PARAMETER == 0x80070057,
+ * STRSAFE_E_INSUFFICIENT_BUFFER == 0x8007007a,
+ * do not have assigned values in the NTSTATUS space.
+ */
+ return (NTSTATUS)hr;
To me that sounds like an argument of why you _can't_ do that.
(You know the Rtl versions of these functions give you an NTSTATUS btw,
right?)
---
branches/setup_improvements/base/setup/lib/arcname_tests.c (added)
+++ branches/setup_improvements/base/setup/lib/arcname_tests.c [iso-8859-1] Mon May 22
01:09:35 2017
@@ -0,0 +1,142 @@
+/*
+ * Tests for the arcname.c functions:
+ * - ArcPathNormalize(),
+ * - ArcPathToNtPath().
+ *
+ * You should certainly fix the included headers before being able
+ * to compile this file (as I didn't bother to have it compilable
+ * under our (P/N)DK, but just under VS).
+ */
Wine's test framework works okay for unit tests. You can make this an
apitest by just #include'ing the C source file, then it can run on
Testbot.