|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH 01/17] xeniface: Sync common files with xenbus
xenbus common files annotations are already correctly converted to SAL 2.0.
We reuse these common files in xeniface.
Synced files:
* assert.h
* registry.h, registry.c
* util.h
Signed-off-by: Césaire Mounah <cesaire.mounah@xxxxxxxxxx>
---
src/xeniface/assert.h | 82 ++++----
src/xeniface/registry.c | 452 +++++++++++++++++++++++-----------------
src/xeniface/registry.h | 207 +++++++++---------
src/xeniface/util.h | 90 ++++----
4 files changed, 464 insertions(+), 367 deletions(-)
diff --git a/src/xeniface/assert.h b/src/xeniface/assert.h
index d4d977b..64d72cd 100644
--- a/src/xeniface/assert.h
+++ b/src/xeniface/assert.h
@@ -1,32 +1,32 @@
/* Copyright (c) Xen Project.
* Copyright (c) Cloud Software Group, Inc.
* All rights reserved.
- *
- * Redistribution and use in source and binary forms,
- * with or without modification, are permitted provided
+ *
+ * Redistribution and use in source and binary forms,
+ * with or without modification, are permitted provided
* that the following conditions are met:
- *
- * * Redistributions of source code must retain the above
- * copyright notice, this list of conditions and the
+ *
+ * * Redistributions of source code must retain the above
+ * copyright notice, this list of conditions and the
* following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the
- * following disclaimer in the documentation and/or other
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the
+ * following disclaimer in the documentation and/or other
* materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
- * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
@@ -39,11 +39,11 @@
static FORCEINLINE VOID
__Bug(
- IN ULONG Code,
- IN ULONG_PTR Parameter1,
- IN ULONG_PTR Parameter2,
- IN ULONG_PTR Parameter3,
- IN ULONG_PTR Parameter4
+ _In_ ULONG Code,
+ _In_ ULONG_PTR Parameter1,
+ _In_ ULONG_PTR Parameter2,
+ _In_ ULONG_PTR Parameter3,
+ _In_ ULONG_PTR Parameter4
)
{
#pragma prefast(suppress:28159)
@@ -58,8 +58,8 @@ __Bug(
#define BUG(_TEXT) \
do { \
- const CHAR *_Text = (_TEXT); \
- const CHAR *_File = __FILE__; \
+ PCSTR _Text = (_TEXT); \
+ PCSTR _File = __FILE__; \
ULONG _Line = __LINE__; \
\
Error("BUG: " _TEXT "\n"); \
@@ -89,7 +89,7 @@ __Bug(
#define ASSERT(_EXP) \
do { \
__ASSERT(_EXP); \
- __analysis_assume(_EXP); \
+ _Analysis_assume_(_EXP); \
} while (FALSE)
#define ASSERT3U(_X, _OP, _Y) \
@@ -132,7 +132,7 @@ __Bug(
#define ASSERT(_EXP) \
do { \
- __analysis_assume(_EXP); \
+ _Analysis_assume_(_EXP); \
} while (FALSE)
#define ASSERT3U(_X, _OP, _Y) \
@@ -154,10 +154,10 @@ __Bug(
static __inline BOOLEAN
_IsZeroMemory(
- IN const PCHAR Caller,
- IN const PCHAR Name,
- IN PVOID Buffer,
- IN ULONG Length
+ _In_ PCSTR Caller,
+ _In_ PCSTR Name,
+ _In_ PVOID Buffer,
+ _In_ ULONG Length
)
{
ULONG Offset;
@@ -166,7 +166,7 @@ _IsZeroMemory(
while (Offset < Length) {
if (*((PUCHAR)Buffer + Offset) != 0) {
Error("%s: non-zero byte in %s (0x%p+0x%x)\n", Caller, Name,
Buffer, Offset);
- return FALSE;
+ return TRUE;
}
Offset++;
}
@@ -178,10 +178,10 @@ _IsZeroMemory(
static __inline BOOLEAN
_IsZeroMemory(
- IN const PCHAR Caller,
- IN const PCHAR Name,
- IN PVOID Buffer,
- IN ULONG Length
+ _In_ PCSTR Caller,
+ _In_ PCSTR Name,
+ _In_ PVOID Buffer,
+ _In_ ULONG Length
)
{
UNREFERENCED_PARAMETER(Caller);
diff --git a/src/xeniface/registry.c b/src/xeniface/registry.c
index fef8c1b..9789db9 100644
--- a/src/xeniface/registry.c
+++ b/src/xeniface/registry.c
@@ -1,32 +1,32 @@
/* Copyright (c) Xen Project.
* Copyright (c) Cloud Software Group, Inc.
* All rights reserved.
- *
- * Redistribution and use in source and binary forms,
- * with or without modification, are permitted provided
+ *
+ * Redistribution and use in source and binary forms,
+ * with or without modification, are permitted provided
* that the following conditions are met:
- *
- * * Redistributions of source code must retain the above
- * copyright notice, this list of conditions and the
+ *
+ * * Redistributions of source code must retain the above
+ * copyright notice, this list of conditions and the
* following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the
- * following disclaimer in the documentation and/or other
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the
+ * following disclaimer in the documentation and/or other
* materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
- * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
@@ -47,7 +47,7 @@ static IOOPENDRIVERREGISTRYKEY __IoOpenDriverRegistryKey;
static FORCEINLINE PVOID
__RegistryAllocate(
- IN ULONG Length
+ _In_ ULONG Length
)
{
return __AllocatePoolWithTag(NonPagedPool, Length, REGISTRY_TAG);
@@ -55,7 +55,7 @@ __RegistryAllocate(
static FORCEINLINE VOID
__RegistryFree(
- IN PVOID Buffer
+ _In_ PVOID Buffer
)
{
__FreePoolWithTag(Buffer, REGISTRY_TAG);
@@ -64,8 +64,8 @@ __RegistryFree(
NTSTATUS
#pragma prefast(suppress:28101) // unannotated DriverEntry function
RegistryInitialize(
- IN PDRIVER_OBJECT DriverObject,
- IN PUNICODE_STRING Path
+ _In_opt_ PDRIVER_OBJECT DriverObject,
+ _In_ PUNICODE_STRING Path
)
{
UNICODE_STRING Unicode;
@@ -110,21 +110,60 @@ RegistryTeardown(
RegistryPath.MaximumLength = RegistryPath.Length = 0;
}
-PUNICODE_STRING
-RegistryGetPath(
- VOID
+NTSTATUS
+RegistryOpenParametersKey(
+ _In_ ACCESS_MASK DesiredAccess,
+ _Out_ PHANDLE Key
)
{
- return &RegistryPath;
-}
+ HANDLE ServiceKey;
+ NTSTATUS status;
+
+ if (__IoOpenDriverRegistryKey != NULL) {
+ status = __IoOpenDriverRegistryKey(RegistryDriverObject,
+ DriverRegKeyParameters,
+ DesiredAccess,
+ 0,
+ Key);
+ if (!NT_SUCCESS(status))
+ goto fail1;
+ goto done;
+ }
+
+ status = RegistryOpenKey(NULL, &RegistryPath, DesiredAccess, &ServiceKey);
+ if (!NT_SUCCESS(status))
+ goto fail2;
+
+ status = RegistryOpenSubKey(ServiceKey, "Parameters", DesiredAccess, Key);
+ if (!NT_SUCCESS(status))
+ goto fail3;
+
+ RegistryCloseKey(ServiceKey);
+
+done:
+ return STATUS_SUCCESS;
+
+fail3:
+ Error("fail3\n");
+
+ RegistryCloseKey(ServiceKey);
+
+fail2:
+ Error("fail2\n");
+
+fail1:
+ Error("fail1 %08x\n", status);
+
+ return status;
+}
NTSTATUS
RegistryOpenKey(
- IN HANDLE Parent,
- IN PUNICODE_STRING Path,
- IN ACCESS_MASK DesiredAccess,
- OUT PHANDLE Key
+ _In_opt_ HANDLE Parent,
+ _In_ PUNICODE_STRING Path,
+ _In_ ACCESS_MASK DesiredAccess,
+ _Out_ PHANDLE Key
)
{
OBJECT_ATTRIBUTES Attributes;
@@ -150,15 +189,15 @@ fail1:
static NTSTATUS
RegistryOpenRoot(
- IN PWCHAR Path,
- OUT PHANDLE Parent,
- OUT PWCHAR *ChildPath
+ _In_ PWSTR Path,
+ _Out_ PHANDLE Parent,
+ _Outptr_result_z_ PWSTR *ChildPath
)
{
- const WCHAR Prefix[] = L"\\Registry\\Machine\\";
- ULONG Length;
- UNICODE_STRING Unicode;
- NTSTATUS status;
+ PCWSTR Prefix = L"\\Registry\\Machine\\";
+ ULONG Length;
+ UNICODE_STRING Unicode;
+ NTSTATUS status;
Length = (ULONG)wcslen(Prefix);
@@ -183,17 +222,17 @@ fail1:
NTSTATUS
RegistryCreateKey(
- IN HANDLE Parent,
- IN PUNICODE_STRING Path,
- IN ULONG Options,
- OUT PHANDLE Key
+ _In_opt_ HANDLE Parent,
+ _In_ PUNICODE_STRING Path,
+ _In_ ULONG Options,
+ _Out_ PHANDLE Key
)
{
- PWCHAR Buffer;
+ PWSTR Buffer;
HANDLE Root;
- PWCHAR ChildPath;
- PWCHAR ChildName;
- PWCHAR Context;
+ PWSTR ChildPath;
+ PWSTR ChildName;
+ PWSTR Context;
HANDLE Child;
NTSTATUS status;
@@ -283,8 +322,8 @@ fail1:
NTSTATUS
RegistryOpenServiceKey(
- IN ACCESS_MASK DesiredAccess,
- OUT PHANDLE Key
+ _In_ ACCESS_MASK DesiredAccess,
+ _Out_ PHANDLE Key
)
{
return RegistryOpenKey(NULL, &RegistryPath, DesiredAccess, Key);
@@ -292,65 +331,17 @@ RegistryOpenServiceKey(
NTSTATUS
RegistryCreateServiceKey(
- OUT PHANDLE Key
+ _Out_ PHANDLE Key
)
{
return RegistryCreateKey(NULL, &RegistryPath, REG_OPTION_NON_VOLATILE,
Key);
}
-NTSTATUS
-RegistryOpenParametersKey(
- IN ACCESS_MASK DesiredAccess,
- OUT PHANDLE Key
- )
-{
- HANDLE ServiceKey;
- NTSTATUS status;
-
- if (__IoOpenDriverRegistryKey != NULL) {
- status = __IoOpenDriverRegistryKey(RegistryDriverObject,
- DriverRegKeyParameters,
- DesiredAccess,
- 0,
- Key);
- if (!NT_SUCCESS(status))
- goto fail1;
-
- goto done;
- }
-
- status = RegistryOpenKey(NULL, &RegistryPath, DesiredAccess, &ServiceKey);
- if (!NT_SUCCESS(status))
- goto fail2;
-
- status = RegistryOpenSubKey(ServiceKey, "Parameters", DesiredAccess, Key);
- if (!NT_SUCCESS(status))
- goto fail3;
-
- RegistryCloseKey(ServiceKey);
-
-done:
- return STATUS_SUCCESS;
-
-fail3:
- Error("fail3\n");
-
- RegistryCloseKey(ServiceKey);
-
-fail2:
- Error("fail2\n");
-
-fail1:
- Error("fail1 %08x\n", status);
-
- return status;
-}
-
NTSTATUS
RegistryOpenSoftwareKey(
- IN PDEVICE_OBJECT DeviceObject,
- IN ACCESS_MASK DesiredAccess,
- OUT PHANDLE Key
+ _In_ PDEVICE_OBJECT DeviceObject,
+ _In_ ACCESS_MASK DesiredAccess,
+ _Out_ PHANDLE Key
)
{
NTSTATUS status;
@@ -370,15 +361,15 @@ fail1:
NTSTATUS
RegistryOpenHardwareKey(
- IN PDEVICE_OBJECT DeviceObject,
- IN ACCESS_MASK DesiredAccess,
- OUT PHANDLE Key
+ _In_ PDEVICE_OBJECT DeviceObject,
+ _In_ ACCESS_MASK DesiredAccess,
+ _Out_ PHANDLE Key
)
{
HANDLE SubKey;
ULONG Length;
PKEY_NAME_INFORMATION Info;
- PWCHAR Cursor;
+ PWSTR Cursor;
UNICODE_STRING Unicode;
NTSTATUS status;
@@ -395,11 +386,11 @@ RegistryOpenHardwareKey(
NULL,
0,
&Length);
- if (status != STATUS_BUFFER_OVERFLOW &&
+ if (!NT_SUCCESS(status) &&
+ status != STATUS_BUFFER_OVERFLOW &&
status != STATUS_BUFFER_TOO_SMALL)
goto fail2;
-#pragma prefast(suppress:6102)
Info = __RegistryAllocate(Length + sizeof (WCHAR));
status = STATUS_NO_MEMORY;
@@ -420,7 +411,7 @@ RegistryOpenHardwareKey(
ASSERT(Cursor != NULL);
*Cursor = L'\0';
-
+
RtlInitUnicodeString(&Unicode, Info->Name);
status = RegistryOpenKey(NULL, &Unicode, DesiredAccess, Key);
@@ -447,10 +438,10 @@ fail1:
NTSTATUS
RegistryOpenSubKey(
- IN PHANDLE Key,
- IN PCHAR Name,
- IN ACCESS_MASK DesiredAccess,
- OUT PHANDLE SubKey
+ _In_opt_ PHANDLE Key,
+ _In_ PSTR Name,
+ _In_ ACCESS_MASK DesiredAccess,
+ _Out_ PHANDLE SubKey
)
{
ANSI_STRING Ansi;
@@ -480,10 +471,10 @@ fail1:
NTSTATUS
RegistryCreateSubKey(
- IN PHANDLE Key,
- IN PCHAR Name,
- IN ULONG Options,
- OUT PHANDLE SubKey
+ _In_opt_ HANDLE Key,
+ _In_ PSTR Name,
+ _In_ ULONG Options,
+ _Out_ PHANDLE SubKey
)
{
ANSI_STRING Ansi;
@@ -513,8 +504,8 @@ fail1:
NTSTATUS
RegistryDeleteSubKey(
- IN PHANDLE Key,
- IN PCHAR Name
+ _In_ PHANDLE Key,
+ _In_ PSTR Name
)
{
ANSI_STRING Ansi;
@@ -554,9 +545,9 @@ fail1:
NTSTATUS
RegistryEnumerateSubKeys(
- IN HANDLE Key,
- IN NTSTATUS (*Callback)(PVOID, HANDLE, PANSI_STRING),
- IN PVOID Context
+ _In_ HANDLE Key,
+ _In_ NTSTATUS (*Callback)(PVOID, HANDLE, PANSI_STRING),
+ _In_ PVOID Context
)
{
ULONG Size;
@@ -574,7 +565,6 @@ RegistryEnumerateSubKeys(
status != STATUS_BUFFER_TOO_SMALL)
goto fail1;
-#pragma prefast(suppress:6102)
Full = __RegistryAllocate(Size);
status = STATUS_NO_MEMORY;
@@ -625,7 +615,7 @@ RegistryEnumerateSubKeys(
status = RtlUnicodeStringToAnsiString(&Ansi, &Unicode, FALSE);
ASSERT(NT_SUCCESS(status));
- Ansi.Length = (USHORT)(strlen(Ansi.Buffer) * sizeof (CHAR));
+ Ansi.Length = (USHORT)(strlen(Ansi.Buffer) * sizeof (CHAR));
status = Callback(Context, Key, &Ansi);
@@ -650,7 +640,7 @@ fail5:
fail4:
fail3:
__RegistryFree(Full);
-
+
fail2:
fail1:
return status;
@@ -658,9 +648,9 @@ fail1:
NTSTATUS
RegistryEnumerateValues(
- IN HANDLE Key,
- IN NTSTATUS (*Callback)(PVOID, HANDLE, PANSI_STRING,
ULONG),
- IN PVOID Context
+ _In_ HANDLE Key,
+ _In_ NTSTATUS (*Callback)(PVOID, HANDLE, PANSI_STRING,
ULONG),
+ _In_ PVOID Context
)
{
ULONG Size;
@@ -678,7 +668,6 @@ RegistryEnumerateValues(
status != STATUS_BUFFER_TOO_SMALL)
goto fail1;
-#pragma prefast(suppress:6102)
Full = __RegistryAllocate(Size);
status = STATUS_NO_MEMORY;
@@ -722,17 +711,24 @@ RegistryEnumerateValues(
Ansi.MaximumLength = (USHORT)((Basic->NameLength / sizeof (WCHAR)) +
sizeof (CHAR));
Ansi.Buffer = __RegistryAllocate(Ansi.MaximumLength);
+ status = STATUS_NO_MEMORY;
+ if (Ansi.Buffer == NULL)
+ goto fail6;
+
status = RtlUnicodeStringToAnsiString(&Ansi, &Unicode, FALSE);
- ASSERT(NT_SUCCESS(status));
+ if (!NT_SUCCESS(status)) {
+ __RegistryFree(Ansi.Buffer);
+ goto fail7;
+ }
- Ansi.Length = (USHORT)(strlen(Ansi.Buffer) * sizeof (CHAR));
+ Ansi.Length = (USHORT)(strlen(Ansi.Buffer) * sizeof (CHAR));
status = Callback(Context, Key, &Ansi, Basic->Type);
__RegistryFree(Ansi.Buffer);
if (!NT_SUCCESS(status))
- goto fail6;
+ goto fail8;
}
__RegistryFree(Basic);
@@ -741,6 +737,8 @@ RegistryEnumerateValues(
return STATUS_SUCCESS;
+fail8:
+fail7:
fail6:
fail5:
__RegistryFree(Basic);
@@ -748,7 +746,7 @@ fail5:
fail4:
fail3:
__RegistryFree(Full);
-
+
fail2:
fail1:
return status;
@@ -756,8 +754,8 @@ fail1:
NTSTATUS
RegistryDeleteValue(
- IN PHANDLE Key,
- IN PCHAR Name
+ _In_ PHANDLE Key,
+ _In_ PSTR Name
)
{
ANSI_STRING Ansi;
@@ -787,9 +785,9 @@ fail1:
NTSTATUS
RegistryQueryDwordValue(
- IN HANDLE Key,
- IN PCHAR Name,
- OUT PULONG Value
+ _In_ HANDLE Key,
+ _In_ PSTR Name,
+ _Out_ PULONG Value
)
{
ANSI_STRING Ansi;
@@ -803,18 +801,18 @@ RegistryQueryDwordValue(
status = RtlAnsiStringToUnicodeString(&Unicode, &Ansi, TRUE);
if (!NT_SUCCESS(status))
goto fail1;
-
+
status = ZwQueryValueKey(Key,
&Unicode,
KeyValuePartialInformation,
NULL,
0,
&Size);
- if (status != STATUS_BUFFER_OVERFLOW &&
+ if (!NT_SUCCESS(status) &&
+ status != STATUS_BUFFER_OVERFLOW &&
status != STATUS_BUFFER_TOO_SMALL)
goto fail2;
-#pragma prefast(suppress:6102)
Partial = __RegistryAllocate(Size);
status = STATUS_NO_MEMORY;
@@ -835,7 +833,77 @@ RegistryQueryDwordValue(
Partial->DataLength != sizeof (ULONG))
goto fail5;
- *Value = *(PULONG)Partial->Data;
+ *Value = *(PULONG)Partial->Data;
+
+ __RegistryFree(Partial);
+
+ RtlFreeUnicodeString(&Unicode);
+
+ return STATUS_SUCCESS;
+
+fail5:
+fail4:
+ __RegistryFree(Partial);
+
+fail3:
+fail2:
+ RtlFreeUnicodeString(&Unicode);
+
+fail1:
+ return status;
+}
+
+NTSTATUS
+RegistryQueryQwordValue(
+ _In_ HANDLE Key,
+ _In_ PSTR Name,
+ _Out_ PULONGLONG Value
+ )
+{
+ ANSI_STRING Ansi;
+ UNICODE_STRING Unicode;
+ PKEY_VALUE_PARTIAL_INFORMATION Partial;
+ ULONG Size;
+ NTSTATUS status;
+
+ RtlInitAnsiString(&Ansi, Name);
+
+ status = RtlAnsiStringToUnicodeString(&Unicode, &Ansi, TRUE);
+ if (!NT_SUCCESS(status))
+ goto fail1;
+
+ status = ZwQueryValueKey(Key,
+ &Unicode,
+ KeyValuePartialInformation,
+ NULL,
+ 0,
+ &Size);
+ if (!NT_SUCCESS(status) &&
+ status != STATUS_BUFFER_OVERFLOW &&
+ status != STATUS_BUFFER_TOO_SMALL)
+ goto fail2;
+
+ Partial = __RegistryAllocate(Size);
+
+ status = STATUS_NO_MEMORY;
+ if (Partial == NULL)
+ goto fail3;
+
+ status = ZwQueryValueKey(Key,
+ &Unicode,
+ KeyValuePartialInformation,
+ Partial,
+ Size,
+ &Size);
+ if (!NT_SUCCESS(status))
+ goto fail4;
+
+ status = STATUS_INVALID_PARAMETER;
+ if (Partial->Type != REG_QWORD ||
+ Partial->DataLength != sizeof (ULONGLONG))
+ goto fail5;
+
+ *Value = *(PULONGLONG)Partial->Data;
__RegistryFree(Partial);
@@ -857,9 +925,9 @@ fail1:
NTSTATUS
RegistryUpdateDwordValue(
- IN HANDLE Key,
- IN PCHAR Name,
- IN ULONG Value
+ _In_ HANDLE Key,
+ _In_ PSTR Name,
+ _In_ ULONG Value
)
{
ANSI_STRING Ansi;
@@ -872,7 +940,7 @@ RegistryUpdateDwordValue(
status = RtlAnsiStringToUnicodeString(&Unicode, &Ansi, TRUE);
if (!NT_SUCCESS(status))
goto fail1;
-
+
Partial = __RegistryAllocate(FIELD_OFFSET(KEY_VALUE_PARTIAL_INFORMATION,
Data) +
sizeof (ULONG));
@@ -883,7 +951,7 @@ RegistryUpdateDwordValue(
Partial->TitleIndex = 0;
Partial->Type = REG_DWORD;
Partial->DataLength = sizeof (ULONG);
- *(PULONG)Partial->Data = Value;
+ *(PULONG)Partial->Data = Value;
status = ZwSetValueKey(Key,
&Unicode,
@@ -913,7 +981,7 @@ fail1:
static PANSI_STRING
RegistrySzToAnsi(
- IN PWCHAR Buffer
+ _In_ PWSTR Buffer
)
{
PANSI_STRING Ansi;
@@ -952,7 +1020,7 @@ fail1:
static PANSI_STRING
RegistryMultiSzToAnsi(
- IN PWCHAR Buffer
+ _In_ PWSTR Buffer
)
{
PANSI_STRING Ansi;
@@ -1014,10 +1082,10 @@ fail1:
NTSTATUS
RegistryQuerySzValue(
- IN HANDLE Key,
- IN PCHAR Name,
- OUT PULONG Type OPTIONAL,
- OUT PANSI_STRING *Array
+ _In_ HANDLE Key,
+ _In_ PSTR Name,
+ _Out_opt_ PULONG Type,
+ _Outptr_ PANSI_STRING *Array
)
{
ANSI_STRING Ansi;
@@ -1031,18 +1099,18 @@ RegistryQuerySzValue(
status = RtlAnsiStringToUnicodeString(&Unicode, &Ansi, TRUE);
if (!NT_SUCCESS(status))
goto fail1;
-
+
status = ZwQueryValueKey(Key,
&Unicode,
KeyValuePartialInformation,
NULL,
0,
&Size);
- if (status != STATUS_BUFFER_OVERFLOW &&
+ if (!NT_SUCCESS(status) &&
+ status != STATUS_BUFFER_OVERFLOW &&
status != STATUS_BUFFER_TOO_SMALL)
goto fail2;
-#pragma prefast(suppress:6102)
Value = __RegistryAllocate(Size);
status = STATUS_NO_MEMORY;
@@ -1061,12 +1129,12 @@ RegistryQuerySzValue(
switch (Value->Type) {
case REG_SZ:
status = STATUS_NO_MEMORY;
- *Array = RegistrySzToAnsi((PWCHAR)Value->Data);
+ *Array = RegistrySzToAnsi((PWSTR)Value->Data);
break;
case REG_MULTI_SZ:
status = STATUS_NO_MEMORY;
- *Array = RegistryMultiSzToAnsi((PWCHAR)Value->Data);
+ *Array = RegistryMultiSzToAnsi((PWSTR)Value->Data);
break;
default:
@@ -1101,10 +1169,10 @@ fail1:
NTSTATUS
RegistryQueryBinaryValue(
- IN HANDLE Key,
- IN PCHAR Name,
- OUT PVOID *Buffer,
- OUT PULONG Length
+ _In_ HANDLE Key,
+ _In_ PSTR Name,
+ _Outptr_ PVOID *Buffer,
+ _Out_ PULONG Length
)
{
ANSI_STRING Ansi;
@@ -1125,11 +1193,11 @@ RegistryQueryBinaryValue(
NULL,
0,
&Size);
- if (status != STATUS_BUFFER_OVERFLOW &&
+ if (!NT_SUCCESS(status) &&
+ status != STATUS_BUFFER_OVERFLOW &&
status != STATUS_BUFFER_TOO_SMALL)
goto fail2;
-#pragma prefast(suppress:6102)
Partial = __RegistryAllocate(Size);
status = STATUS_NO_MEMORY;
@@ -1186,10 +1254,10 @@ fail1:
NTSTATUS
RegistryUpdateBinaryValue(
- IN HANDLE Key,
- IN PCHAR Name,
- IN PVOID Buffer,
- IN ULONG Length
+ _In_ HANDLE Key,
+ _In_ PSTR Name,
+ _In_ PVOID Buffer,
+ _In_ ULONG Length
)
{
ANSI_STRING Ansi;
@@ -1243,8 +1311,8 @@ fail1:
NTSTATUS
RegistryQueryKeyName(
- IN HANDLE Key,
- OUT PANSI_STRING *Array
+ _In_ HANDLE Key,
+ _Outptr_ PANSI_STRING *Array
)
{
PKEY_NAME_INFORMATION Value;
@@ -1256,12 +1324,12 @@ RegistryQueryKeyName(
NULL,
0,
&Size);
- if (status != STATUS_BUFFER_OVERFLOW &&
+ if (!NT_SUCCESS(status) &&
+ status != STATUS_BUFFER_OVERFLOW &&
status != STATUS_BUFFER_TOO_SMALL)
goto fail1;
// Name information is not intrinsically NULL terminated
-#pragma prefast(suppress:6102)
Value = __RegistryAllocate(Size + sizeof (WCHAR));
status = STATUS_NO_MEMORY;
@@ -1277,7 +1345,7 @@ RegistryQueryKeyName(
goto fail3;
Value->Name[Value->NameLength / sizeof (WCHAR)] = L'\0';
- *Array = RegistrySzToAnsi((PWCHAR)Value->Name);
+ *Array = RegistrySzToAnsi((PWSTR)Value->Name);
status = STATUS_NO_MEMORY;
if (*Array == NULL)
@@ -1298,20 +1366,20 @@ fail1:
NTSTATUS
RegistryQuerySystemStartOption(
- IN PCHAR Prefix,
- OUT PANSI_STRING *Value
+ _In_ PSTR Prefix,
+ _Outptr_ PANSI_STRING *Value
)
{
UNICODE_STRING Unicode;
HANDLE Key;
PANSI_STRING Ansi;
ULONG Length;
- PCHAR Option;
- PCHAR Context;
+ PSTR Option;
+ PSTR Context;
NTSTATUS status;
RtlInitUnicodeString(&Unicode,
L"\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\Control");
-
+
status = RegistryOpenKey(NULL, &Unicode, KEY_READ, &Key);
if (!NT_SUCCESS(status))
goto fail1;
@@ -1481,10 +1549,10 @@ fail1:
NTSTATUS
RegistryUpdateSzValue(
- IN HANDLE Key,
- IN PCHAR Name,
- IN ULONG Type,
- IN PANSI_STRING Array
+ _In_ HANDLE Key,
+ _In_ PSTR Name,
+ _In_ ULONG Type,
+ _In_ PANSI_STRING Array
)
{
ANSI_STRING Ansi;
@@ -1545,7 +1613,7 @@ fail1:
VOID
RegistryFreeSzValue(
- IN PANSI_STRING Array
+ _In_ PANSI_STRING Array
)
{
ULONG Index;
@@ -1561,7 +1629,7 @@ RegistryFreeSzValue(
VOID
RegistryFreeBinaryValue(
- IN PVOID Buffer
+ _In_ PVOID Buffer
)
{
__RegistryFree(Buffer);
@@ -1569,8 +1637,16 @@ RegistryFreeBinaryValue(
VOID
RegistryCloseKey(
- IN HANDLE Key
+ _In_ HANDLE Key
)
{
ZwClose(Key);
}
+
+PUNICODE_STRING
+RegistryGetPath(
+ VOID
+ )
+{
+ return &RegistryPath;
+}
\ No newline at end of file
diff --git a/src/xeniface/registry.h b/src/xeniface/registry.h
index 42ee9c8..867aefc 100644
--- a/src/xeniface/registry.h
+++ b/src/xeniface/registry.h
@@ -1,32 +1,32 @@
/* Copyright (c) Xen Project.
* Copyright (c) Cloud Software Group, Inc.
* All rights reserved.
- *
- * Redistribution and use in source and binary forms,
- * with or without modification, are permitted provided
+ *
+ * Redistribution and use in source and binary forms,
+ * with or without modification, are permitted provided
* that the following conditions are met:
- *
- * * Redistributions of source code must retain the above
- * copyright notice, this list of conditions and the
+ *
+ * * Redistributions of source code must retain the above
+ * copyright notice, this list of conditions and the
* following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the
- * following disclaimer in the documentation and/or other
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the
+ * following disclaimer in the documentation and/or other
* materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
- * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
@@ -37,8 +37,8 @@
extern NTSTATUS
RegistryInitialize(
- IN PDRIVER_OBJECT DriverObject,
- IN PUNICODE_STRING Path
+ _In_opt_ PDRIVER_OBJECT DrvObj,
+ _In_ PUNICODE_STRING Path
);
extern VOID
@@ -46,171 +46,178 @@ RegistryTeardown(
VOID
);
-extern PUNICODE_STRING
-RegistryGetPath(
- VOID
+extern NTSTATUS
+RegistryOpenParametersKey(
+ _In_ ACCESS_MASK DesiredAccess,
+ _Out_ PHANDLE Key
);
extern NTSTATUS
RegistryOpenKey(
- IN HANDLE Parent,
- IN PUNICODE_STRING Path,
- IN ACCESS_MASK DesiredAccess,
- OUT PHANDLE Key
+ _In_opt_ HANDLE Parent,
+ _In_ PUNICODE_STRING Path,
+ _In_ ACCESS_MASK DesiredAccess,
+ _Out_ PHANDLE Key
);
extern NTSTATUS
RegistryCreateKey(
- IN HANDLE Parent,
- IN PUNICODE_STRING Path,
- IN ULONG Options,
- OUT PHANDLE Key
+ _In_opt_ HANDLE Parent,
+ _In_ PUNICODE_STRING Path,
+ _In_ ULONG Options,
+ _Out_ PHANDLE Key
);
extern NTSTATUS
RegistryOpenServiceKey(
- IN ACCESS_MASK DesiredAccess,
- OUT PHANDLE Key
+ _In_ ACCESS_MASK DesiredAccess,
+ _Out_ PHANDLE Key
);
extern NTSTATUS
RegistryCreateServiceKey(
- OUT PHANDLE Key
- );
-
-extern NTSTATUS
-RegistryOpenParametersKey(
- IN ACCESS_MASK DesiredAccess,
- OUT PHANDLE Key
+ _Out_ PHANDLE Key
);
extern NTSTATUS
RegistryOpenSoftwareKey(
- IN PDEVICE_OBJECT DeviceObject,
- IN ACCESS_MASK DesiredAccess,
- OUT PHANDLE Key
+ _In_ PDEVICE_OBJECT DeviceObject,
+ _In_ ACCESS_MASK DesiredAccess,
+ _Out_ PHANDLE Key
);
extern NTSTATUS
RegistryOpenHardwareKey(
- IN PDEVICE_OBJECT DeviceObject,
- IN ACCESS_MASK DesiredAccess,
- OUT PHANDLE Key
+ _In_ PDEVICE_OBJECT DeviceObject,
+ _In_ ACCESS_MASK DesiredAccess,
+ _Out_ PHANDLE Key
);
extern NTSTATUS
RegistryOpenSubKey(
- IN HANDLE Key,
- IN PCHAR Name,
- IN ACCESS_MASK DesiredAccess,
- OUT PHANDLE SubKey
+ _In_opt_ HANDLE Key,
+ _In_ PSTR Name,
+ _In_ ACCESS_MASK DesiredAccess,
+ _Out_ PHANDLE SubKey
);
extern NTSTATUS
RegistryCreateSubKey(
- IN HANDLE Key,
- IN PCHAR Name,
- IN ULONG Options,
- OUT PHANDLE SubKey
+ _In_opt_ HANDLE Key,
+ _In_ PSTR Name,
+ _In_ ULONG Options,
+ _Out_ PHANDLE SubKey
);
extern NTSTATUS
RegistryDeleteSubKey(
- IN HANDLE Key,
- IN PCHAR Name
+ _In_ HANDLE Key,
+ _In_ PSTR Name
);
extern NTSTATUS
RegistryEnumerateSubKeys(
- IN HANDLE Key,
- IN NTSTATUS (*Callback)(PVOID, HANDLE, PANSI_STRING),
- IN PVOID Context
+ _In_ HANDLE Key,
+ _In_ NTSTATUS (*Callback)(PVOID, HANDLE, PANSI_STRING),
+ _In_ PVOID Context
);
extern NTSTATUS
RegistryEnumerateValues(
- IN HANDLE Key,
- IN NTSTATUS (*Callback)(PVOID, HANDLE, PANSI_STRING, ULONG),
- IN PVOID Context
+ _In_ HANDLE Key,
+ _In_ NTSTATUS (*Callback)(PVOID, HANDLE, PANSI_STRING, ULONG),
+ _In_ PVOID Context
);
extern NTSTATUS
RegistryDeleteValue(
- IN HANDLE Key,
- IN PCHAR Name
+ _In_ HANDLE Key,
+ _In_ PSTR Name
);
extern NTSTATUS
RegistryQueryDwordValue(
- IN HANDLE Key,
- IN PCHAR Name,
- OUT PULONG Value
+ _In_ HANDLE Key,
+ _In_ PSTR Name,
+ _Out_ PULONG Value
);
-
+
+extern NTSTATUS
+RegistryQueryQwordValue(
+ _In_ HANDLE Key,
+ _In_ PSTR Name,
+ _Out_ PULONGLONG Value
+ );
+
extern NTSTATUS
RegistryUpdateDwordValue(
- IN HANDLE Key,
- IN PCHAR Name,
- IN ULONG Value
+ _In_ HANDLE Key,
+ _In_ PSTR Name,
+ _In_ ULONG Value
);
-
+
extern NTSTATUS
RegistryQuerySzValue(
- IN HANDLE Key,
- IN PCHAR Name,
- OUT PULONG Type OPTIONAL,
- OUT PANSI_STRING *Array
+ _In_ HANDLE Key,
+ _In_ PSTR Name,
+ _Out_opt_ PULONG Type,
+ _Outptr_ PANSI_STRING *Array
);
extern NTSTATUS
RegistryQueryBinaryValue(
- IN HANDLE Key,
- IN PCHAR Name,
- OUT PVOID *Buffer,
- OUT PULONG Length
+ _In_ HANDLE Key,
+ _In_ PSTR Name,
+ _Outptr_ PVOID *Buffer,
+ _Out_ PULONG Length
);
extern NTSTATUS
RegistryUpdateBinaryValue(
- IN HANDLE Key,
- IN PCHAR Name,
- IN PVOID Buffer,
- IN ULONG Length
+ _In_ HANDLE Key,
+ _In_ PSTR Name,
+ _In_ PVOID Buffer,
+ _In_ ULONG Length
);
extern NTSTATUS
RegistryQueryKeyName(
- IN HANDLE Key,
- OUT PANSI_STRING *Array
+ _In_ HANDLE Key,
+ _Outptr_ PANSI_STRING *Array
);
extern NTSTATUS
RegistryQuerySystemStartOption(
- IN PCHAR Name,
- OUT PANSI_STRING *Option
+ _In_ PSTR Name,
+ _Outptr_ PANSI_STRING *Option
);
extern VOID
RegistryFreeSzValue(
- IN PANSI_STRING Array
+ _In_ PANSI_STRING Array
);
extern VOID
RegistryFreeBinaryValue(
- IN PVOID Buffer
+ _In_ PVOID Buffer
);
extern NTSTATUS
RegistryUpdateSzValue(
- IN HANDLE Key,
- IN PCHAR Name,
- IN ULONG Type,
- IN PANSI_STRING Array
+ _In_ HANDLE Key,
+ _In_ PSTR Name,
+ _In_ ULONG Type,
+ _In_ PANSI_STRING Array
);
extern VOID
RegistryCloseKey(
- IN HANDLE Key
+ _In_ HANDLE Key
+ );
+
+extern PUNICODE_STRING
+RegistryGetPath(
+ VOID
);
#endif // _XENIFACE_REGISTRY_H
diff --git a/src/xeniface/util.h b/src/xeniface/util.h
index a278d72..8c6a917 100644
--- a/src/xeniface/util.h
+++ b/src/xeniface/util.h
@@ -38,12 +38,12 @@
#include "assert.h"
-#define P2ROUNDUP(_x, _a) \
- (-(-(_x) & -(_a)))
+#define P2ROUNDUP(_t, _x, _a) \
+ (-(-((_t)(_x)) & -(((_t)(_a)))))
static FORCEINLINE LONG
__ffs(
- IN unsigned long long mask
+ _In_ unsigned long long mask
)
{
unsigned char *array = (unsigned char *)&mask;
@@ -82,11 +82,11 @@ __ffs(
static FORCEINLINE VOID
__CpuId(
- IN ULONG Leaf,
- OUT PULONG EAX OPTIONAL,
- OUT PULONG EBX OPTIONAL,
- OUT PULONG ECX OPTIONAL,
- OUT PULONG EDX OPTIONAL
+ _In_ ULONG Leaf,
+ _Out_opt_ PULONG EAX,
+ _Out_opt_ PULONG EBX,
+ _Out_opt_ PULONG ECX,
+ _Out_opt_ PULONG EDX
)
{
int Value[4] = {0};
@@ -108,8 +108,8 @@ __CpuId(
static FORCEINLINE LONG
__InterlockedAdd(
- IN LONG *Value,
- IN LONG Delta
+ _In_ LONG *Value,
+ _In_ LONG Delta
)
{
LONG New;
@@ -125,8 +125,8 @@ __InterlockedAdd(
static FORCEINLINE LONG
__InterlockedSubtract(
- IN LONG *Value,
- IN LONG Delta
+ _In_ LONG *Value,
+ _In_ LONG Delta
)
{
LONG New;
@@ -140,23 +140,24 @@ __InterlockedSubtract(
return New;
}
-__checkReturn
+_Check_return_
static FORCEINLINE PVOID
__AllocatePoolWithTag(
- IN POOL_TYPE PoolType,
- IN SIZE_T NumberOfBytes,
- IN ULONG Tag
+ _In_ POOL_TYPE PoolType,
+ _In_ SIZE_T NumberOfBytes,
+ _In_ ULONG Tag
)
{
PUCHAR Buffer;
- __analysis_assume(PoolType == NonPagedPool ||
+ _Analysis_assume_(PoolType == NonPagedPool ||
PoolType == PagedPool);
if (NumberOfBytes == 0)
return NULL;
#if (_MSC_VER >= 1928) // VS 16.9 (EWDK 20344 or later)
+#pragma warning(suppress:28160) // annotation error
Buffer = ExAllocatePoolUninitialized(PoolType, NumberOfBytes, Tag);
#else
#pragma warning(suppress:28160) // annotation error
@@ -171,8 +172,8 @@ __AllocatePoolWithTag(
static FORCEINLINE VOID
__FreePoolWithTag(
- IN PVOID Buffer,
- IN ULONG Tag
+ _In_ PVOID Buffer,
+ _In_ ULONG Tag
)
{
ExFreePoolWithTag(Buffer, Tag);
@@ -180,28 +181,37 @@ __FreePoolWithTag(
static FORCEINLINE PMDL
__AllocatePages(
- IN ULONG Count
+ _In_ ULONG Count,
+ _In_ BOOLEAN Contiguous
)
{
PHYSICAL_ADDRESS LowAddress;
PHYSICAL_ADDRESS HighAddress;
LARGE_INTEGER SkipBytes;
SIZE_T TotalBytes;
+ ULONG Flags;
PMDL Mdl;
PUCHAR MdlMappedSystemVa;
NTSTATUS status;
LowAddress.QuadPart = 0ull;
HighAddress.QuadPart = ~0ull;
- SkipBytes.QuadPart = 0ull;
TotalBytes = (SIZE_T)PAGE_SIZE * Count;
+ if (Contiguous) {
+ SkipBytes.QuadPart = TotalBytes;
+ Flags = MM_ALLOCATE_REQUIRE_CONTIGUOUS_CHUNKS;
+ } else {
+ SkipBytes.QuadPart = 0ull;
+ Flags = MM_ALLOCATE_FULLY_REQUIRED;
+ }
+
Mdl = MmAllocatePagesForMdlEx(LowAddress,
HighAddress,
SkipBytes,
TotalBytes,
MmCached,
- MM_ALLOCATE_FULLY_REQUIRED);
+ Flags);
status = STATUS_NO_MEMORY;
if (Mdl == NULL)
@@ -245,11 +255,11 @@ fail1:
return NULL;
}
-#define __AllocatePage() __AllocatePages(1)
+#define __AllocatePage() __AllocatePages(1, FALSE)
static FORCEINLINE VOID
__FreePages(
- IN PMDL Mdl
+ _In_ PMDL Mdl
)
{
PUCHAR MdlMappedSystemVa;
@@ -265,15 +275,17 @@ __FreePages(
#define __FreePage(_Mdl) __FreePages(_Mdl)
-static FORCEINLINE PCHAR
+static FORCEINLINE PSTR
__strtok_r(
- IN PCHAR Buffer,
- IN PCHAR Delimiter,
- IN OUT PCHAR *Context
+ _In_opt_ PSTR Buffer,
+ _In_ PSTR Delimiter,
+ _When_(Buffer != NULL, _Outptr_)
+ _When_(Buffer == NULL, _Inout_)
+ PSTR *Context
)
{
- PCHAR Token;
- PCHAR End;
+ PSTR Token;
+ PSTR End;
if (Buffer != NULL)
*Context = Buffer;
@@ -303,15 +315,17 @@ __strtok_r(
return Token;
}
-static FORCEINLINE PWCHAR
+static FORCEINLINE PWSTR
__wcstok_r(
- IN PWCHAR Buffer,
- IN PWCHAR Delimiter,
- IN OUT PWCHAR *Context
+ _In_opt_ PWSTR Buffer,
+ _In_ PWSTR Delimiter,
+ _When_(Buffer != NULL, _Outptr_)
+ _When_(Buffer == NULL, _Inout_)
+ PWSTR *Context
)
{
- PWCHAR Token;
- PWCHAR End;
+ PWSTR Token;
+ PWSTR End;
if (Buffer != NULL)
*Context = Buffer;
@@ -343,7 +357,7 @@ __wcstok_r(
static FORCEINLINE CHAR
__toupper(
- IN CHAR Character
+ _In_ CHAR Character
)
{
if (Character < 'a' || Character > 'z')
@@ -354,7 +368,7 @@ __toupper(
static FORCEINLINE CHAR
__tolower(
- IN CHAR Character
+ _In_ CHAR Character
)
{
if (Character < 'A' || Character > 'Z')
--
2.55.0.windows.5
--
Césaire Mounah | Vates Windows Guest Tools Engineer
XCP-ng & Xen Orchestra - Vates solutions
web: https://vates.tech
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |