mirror of
https://github.com/reactos/reactos.git
synced 2024-12-28 18:15:11 +00:00
[EVENTVWR] Fix settings loading. Remove usage of Rtl functions. Use Win32 CRT assert. (#4752)
- Don't create the settings registry key when trying to load them. Defer its creation when saving the settings. - Use more restricted access rights when opening/creating the key. - Ensure read and written string settings are NULL-terminated. - Use the Win32 CRT assert so that if an assertion fails we get a message on the screen, not via the kernel debugger.
This commit is contained in:
parent
cdf907074d
commit
069b08da0b
2 changed files with 98 additions and 90 deletions
|
@ -346,116 +346,135 @@ Quit:
|
||||||
BOOL
|
BOOL
|
||||||
LoadSettings(int nDefCmdShow)
|
LoadSettings(int nDefCmdShow)
|
||||||
{
|
{
|
||||||
HKEY hKeyEventVwr;
|
|
||||||
LONG Result;
|
LONG Result;
|
||||||
DWORD dwSize;
|
HKEY hKeyEventVwr;
|
||||||
DWORD dwType;
|
DWORD dwType, cbData;
|
||||||
DWORD Value;
|
|
||||||
UNICODE_STRING ValueU;
|
|
||||||
WCHAR buffer[100];
|
WCHAR buffer[100];
|
||||||
|
|
||||||
/* Load the default values */
|
/* Load the default values */
|
||||||
|
Settings.bSaveSettings = TRUE;
|
||||||
Settings.bShowDetailsPane = TRUE;
|
Settings.bShowDetailsPane = TRUE;
|
||||||
Settings.bShowGrid = FALSE;
|
Settings.bShowGrid = FALSE;
|
||||||
Settings.bSaveSettings = TRUE;
|
|
||||||
Settings.bNewestEventsFirst = TRUE;
|
Settings.bNewestEventsFirst = TRUE;
|
||||||
Settings.nVSplitPos = 250; /* Splitter default positions */
|
Settings.nVSplitPos = 250; /* Splitter default positions */
|
||||||
Settings.nHSplitPos = 250;
|
Settings.nHSplitPos = 250;
|
||||||
ZeroMemory(&Settings.wpPos, sizeof(Settings.wpPos));
|
ZeroMemory(&Settings.wpPos, sizeof(Settings.wpPos));
|
||||||
Settings.wpPos.length = sizeof(Settings.wpPos);
|
Settings.wpPos.length = sizeof(Settings.wpPos);
|
||||||
Settings.wpPos.rcNormalPosition.left = CW_USEDEFAULT;
|
SetRect(&Settings.wpPos.rcNormalPosition,
|
||||||
Settings.wpPos.rcNormalPosition.top = CW_USEDEFAULT;
|
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT);
|
||||||
Settings.wpPos.rcNormalPosition.right = CW_USEDEFAULT;
|
Settings.wpPos.showCmd = nDefCmdShow; // SW_SHOWNORMAL;
|
||||||
Settings.wpPos.rcNormalPosition.bottom = CW_USEDEFAULT;
|
|
||||||
|
|
||||||
/* Try to create/open the Event Viewer user key */
|
/* Try to open the Event Viewer user key */
|
||||||
if (RegCreateKeyExW(HKEY_CURRENT_USER,
|
if (RegOpenKeyExW(HKEY_CURRENT_USER,
|
||||||
EVNTVWR_PARAM_KEY,
|
EVNTVWR_PARAM_KEY,
|
||||||
0,
|
0,
|
||||||
NULL,
|
KEY_QUERY_VALUE,
|
||||||
REG_OPTION_NON_VOLATILE,
|
&hKeyEventVwr) != ERROR_SUCCESS)
|
||||||
KEY_READ | KEY_WRITE,
|
|
||||||
NULL,
|
|
||||||
&hKeyEventVwr,
|
|
||||||
NULL) != ERROR_SUCCESS)
|
|
||||||
{
|
{
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Result = RegQueryValueExW(hKeyEventVwr, L"Filter", NULL, &dwType, (LPBYTE)&szFilter, &dwSize); // REG_SZ
|
// Result = RegQueryValueExW(hKeyEventVwr, L"Filter", NULL, &dwType, (LPBYTE)&szFilter, &cbData); // REG_SZ
|
||||||
// Result = RegQueryValueExW(hKeyEventVwr, L"Find", NULL, &dwType, (LPBYTE)&szFind, &dwSize); // REG_SZ
|
// Result = RegQueryValueExW(hKeyEventVwr, L"Find", NULL, &dwType, (LPBYTE)&szFind, &cbData); // REG_SZ
|
||||||
// Result = RegQueryValueExW(hKeyEventVwr, L"Module", NULL, &dwType, (LPBYTE)&szModule, &dwSize); // REG_SZ
|
// Result = RegQueryValueExW(hKeyEventVwr, L"Module", NULL, &dwType, (LPBYTE)&szModule, &cbData); // REG_SZ
|
||||||
|
|
||||||
dwSize = sizeof(Value);
|
cbData = sizeof(buffer);
|
||||||
Result = RegQueryValueExW(hKeyEventVwr, L"DetailsPane", NULL, &dwType, (LPBYTE)&Value, &dwSize);
|
Result = RegQueryValueExW(hKeyEventVwr, L"SaveSettings", NULL, &dwType, (LPBYTE)buffer, &cbData);
|
||||||
if ((Result == ERROR_SUCCESS) && (dwType == REG_SZ || dwType == REG_DWORD))
|
if (Result == ERROR_SUCCESS)
|
||||||
{
|
{
|
||||||
if (dwType == REG_SZ)
|
if (dwType == REG_SZ)
|
||||||
{
|
{
|
||||||
ValueU.Buffer = (PWSTR)&Value;
|
buffer[cbData / sizeof(WCHAR) - 1] = UNICODE_NULL;
|
||||||
ValueU.Length = ValueU.MaximumLength = dwSize;
|
Settings.bSaveSettings = !!(DWORD)_wtoi(buffer);
|
||||||
RtlUnicodeStringToInteger(&ValueU, 10, &Value);
|
}
|
||||||
|
else if (dwType == REG_DWORD && cbData == sizeof(DWORD))
|
||||||
|
{
|
||||||
|
Settings.bSaveSettings = !!*(PDWORD)buffer;
|
||||||
}
|
}
|
||||||
Settings.bShowDetailsPane = !!Value;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
dwSize = sizeof(Value);
|
cbData = sizeof(buffer);
|
||||||
Result = RegQueryValueExW(hKeyEventVwr, L"ShowGrid", NULL, &dwType, (LPBYTE)&Value, &dwSize);
|
Result = RegQueryValueExW(hKeyEventVwr, L"DetailsPane", NULL, &dwType, (LPBYTE)buffer, &cbData);
|
||||||
if ((Result == ERROR_SUCCESS) && (dwType == REG_SZ || dwType == REG_DWORD))
|
if (Result == ERROR_SUCCESS)
|
||||||
{
|
{
|
||||||
if (dwType == REG_SZ)
|
if (dwType == REG_SZ)
|
||||||
{
|
{
|
||||||
ValueU.Buffer = (PWSTR)&Value;
|
buffer[cbData / sizeof(WCHAR) - 1] = UNICODE_NULL;
|
||||||
ValueU.Length = ValueU.MaximumLength = dwSize;
|
Settings.bShowDetailsPane = !!(DWORD)_wtoi(buffer);
|
||||||
RtlUnicodeStringToInteger(&ValueU, 10, &Value);
|
}
|
||||||
|
else if (dwType == REG_DWORD && cbData == sizeof(DWORD))
|
||||||
|
{
|
||||||
|
Settings.bShowDetailsPane = !!*(PDWORD)buffer;
|
||||||
}
|
}
|
||||||
Settings.bShowGrid = !!Value;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
dwSize = sizeof(Value);
|
cbData = sizeof(buffer);
|
||||||
Result = RegQueryValueExW(hKeyEventVwr, L"SortOrder", NULL, &dwType, (LPBYTE)&Value, &dwSize);
|
Result = RegQueryValueExW(hKeyEventVwr, L"ShowGrid", NULL, &dwType, (LPBYTE)buffer, &cbData);
|
||||||
if ((Result == ERROR_SUCCESS) && (dwType == REG_SZ || dwType == REG_DWORD))
|
if (Result == ERROR_SUCCESS)
|
||||||
{
|
{
|
||||||
if (dwType == REG_SZ)
|
if (dwType == REG_SZ)
|
||||||
{
|
{
|
||||||
ValueU.Buffer = (PWSTR)&Value;
|
buffer[cbData / sizeof(WCHAR) - 1] = UNICODE_NULL;
|
||||||
ValueU.Length = ValueU.MaximumLength = dwSize;
|
Settings.bShowGrid = !!(DWORD)_wtoi(buffer);
|
||||||
RtlUnicodeStringToInteger(&ValueU, 10, &Value);
|
}
|
||||||
|
else if (dwType == REG_DWORD && cbData == sizeof(DWORD))
|
||||||
|
{
|
||||||
|
Settings.bShowGrid = !!*(PDWORD)buffer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
cbData = sizeof(buffer);
|
||||||
|
Result = RegQueryValueExW(hKeyEventVwr, L"SortOrder", NULL, &dwType, (LPBYTE)buffer, &cbData);
|
||||||
|
if (Result == ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
if (dwType == REG_SZ)
|
||||||
|
{
|
||||||
|
buffer[cbData / sizeof(WCHAR) - 1] = UNICODE_NULL;
|
||||||
|
Settings.bNewestEventsFirst = !!(DWORD)_wtoi(buffer);
|
||||||
|
}
|
||||||
|
else if (dwType == REG_DWORD && cbData == sizeof(DWORD))
|
||||||
|
{
|
||||||
|
Settings.bNewestEventsFirst = !!*(PDWORD)buffer;
|
||||||
}
|
}
|
||||||
Settings.bNewestEventsFirst = !!Value;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Retrieve the splitter positions */
|
/* Retrieve the splitter positions */
|
||||||
dwSize = sizeof(Value);
|
cbData = sizeof(buffer);
|
||||||
Result = RegQueryValueExW(hKeyEventVwr, L"VSplitPos", NULL, &dwType, (LPBYTE)&Value, &dwSize);
|
Result = RegQueryValueExW(hKeyEventVwr, L"VSplitPos", NULL, &dwType, (LPBYTE)buffer, &cbData);
|
||||||
if ((Result == ERROR_SUCCESS) && (dwType == REG_SZ || dwType == REG_DWORD))
|
if (Result == ERROR_SUCCESS)
|
||||||
{
|
{
|
||||||
if (dwType == REG_SZ)
|
if (dwType == REG_SZ)
|
||||||
{
|
{
|
||||||
ValueU.Buffer = (PWSTR)&Value;
|
buffer[cbData / sizeof(WCHAR) - 1] = UNICODE_NULL;
|
||||||
ValueU.Length = ValueU.MaximumLength = dwSize;
|
Settings.nVSplitPos = (DWORD)_wtoi(buffer);
|
||||||
RtlUnicodeStringToInteger(&ValueU, 10, &Value);
|
}
|
||||||
|
else if (dwType == REG_DWORD && cbData == sizeof(DWORD))
|
||||||
|
{
|
||||||
|
Settings.nVSplitPos = *(PDWORD)buffer;
|
||||||
}
|
}
|
||||||
Settings.nVSplitPos = Value;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
dwSize = sizeof(Value);
|
cbData = sizeof(buffer);
|
||||||
Result = RegQueryValueExW(hKeyEventVwr, L"HSplitPos", NULL, &dwType, (LPBYTE)&Value, &dwSize);
|
Result = RegQueryValueExW(hKeyEventVwr, L"HSplitPos", NULL, &dwType, (LPBYTE)buffer, &cbData);
|
||||||
if ((Result == ERROR_SUCCESS) && (dwType == REG_SZ || dwType == REG_DWORD))
|
if (Result == ERROR_SUCCESS)
|
||||||
{
|
{
|
||||||
if (dwType == REG_SZ)
|
if (dwType == REG_SZ)
|
||||||
{
|
{
|
||||||
ValueU.Buffer = (PWSTR)&Value;
|
buffer[cbData / sizeof(WCHAR) - 1] = UNICODE_NULL;
|
||||||
ValueU.Length = ValueU.MaximumLength = dwSize;
|
Settings.nHSplitPos = (DWORD)_wtoi(buffer);
|
||||||
RtlUnicodeStringToInteger(&ValueU, 10, &Value);
|
}
|
||||||
|
else if (dwType == REG_DWORD && cbData == sizeof(DWORD))
|
||||||
|
{
|
||||||
|
Settings.nHSplitPos = *(PDWORD)buffer;
|
||||||
}
|
}
|
||||||
Settings.nHSplitPos = Value;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Retrieve the geometry of the main window */
|
/* Retrieve the geometry of the main window */
|
||||||
dwSize = sizeof(buffer);
|
cbData = sizeof(buffer);
|
||||||
Result = RegQueryValueExW(hKeyEventVwr, L"Window", NULL, &dwType, (LPBYTE)buffer, &dwSize);
|
Result = RegQueryValueExW(hKeyEventVwr, L"Window", NULL, &dwType, (LPBYTE)buffer, &cbData);
|
||||||
if ((Result != ERROR_SUCCESS) || (dwType != REG_SZ))
|
if ((Result == ERROR_SUCCESS) && (dwType == REG_SZ))
|
||||||
|
buffer[cbData / sizeof(WCHAR) - 1] = UNICODE_NULL;
|
||||||
|
else
|
||||||
buffer[0] = UNICODE_NULL;
|
buffer[0] = UNICODE_NULL;
|
||||||
|
|
||||||
if (swscanf(buffer, L"%d %d %d %d %d",
|
if (swscanf(buffer, L"%d %d %d %d %d",
|
||||||
|
@ -466,26 +485,11 @@ LoadSettings(int nDefCmdShow)
|
||||||
&Settings.wpPos.showCmd) != 5)
|
&Settings.wpPos.showCmd) != 5)
|
||||||
{
|
{
|
||||||
/* Parsing failed, use defaults */
|
/* Parsing failed, use defaults */
|
||||||
Settings.wpPos.rcNormalPosition.left = CW_USEDEFAULT;
|
SetRect(&Settings.wpPos.rcNormalPosition,
|
||||||
Settings.wpPos.rcNormalPosition.top = CW_USEDEFAULT;
|
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT);
|
||||||
Settings.wpPos.rcNormalPosition.right = CW_USEDEFAULT;
|
|
||||||
Settings.wpPos.rcNormalPosition.bottom = CW_USEDEFAULT;
|
|
||||||
Settings.wpPos.showCmd = nDefCmdShow; // SW_SHOWNORMAL;
|
Settings.wpPos.showCmd = nDefCmdShow; // SW_SHOWNORMAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
dwSize = sizeof(Value);
|
|
||||||
Result = RegQueryValueExW(hKeyEventVwr, L"SaveSettings", NULL, &dwType, (LPBYTE)&Value, &dwSize);
|
|
||||||
if ((Result == ERROR_SUCCESS) && (dwType == REG_SZ || dwType == REG_DWORD))
|
|
||||||
{
|
|
||||||
if (dwType == REG_SZ)
|
|
||||||
{
|
|
||||||
ValueU.Buffer = (PWSTR)&Value;
|
|
||||||
ValueU.Length = ValueU.MaximumLength = dwSize;
|
|
||||||
RtlUnicodeStringToInteger(&ValueU, 10, &Value);
|
|
||||||
}
|
|
||||||
Settings.bSaveSettings = !!Value;
|
|
||||||
}
|
|
||||||
|
|
||||||
RegCloseKey(hKeyEventVwr);
|
RegCloseKey(hKeyEventVwr);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
@ -503,7 +507,7 @@ SaveSettings(VOID)
|
||||||
0,
|
0,
|
||||||
NULL,
|
NULL,
|
||||||
REG_OPTION_NON_VOLATILE,
|
REG_OPTION_NON_VOLATILE,
|
||||||
KEY_READ | KEY_WRITE,
|
KEY_SET_VALUE,
|
||||||
NULL,
|
NULL,
|
||||||
&hKeyEventVwr,
|
&hKeyEventVwr,
|
||||||
NULL) != ERROR_SUCCESS)
|
NULL) != ERROR_SUCCESS)
|
||||||
|
@ -543,7 +547,7 @@ SaveSettings(VOID)
|
||||||
Settings.wpPos.rcNormalPosition.bottom,
|
Settings.wpPos.rcNormalPosition.bottom,
|
||||||
Settings.wpPos.showCmd);
|
Settings.wpPos.showCmd);
|
||||||
|
|
||||||
dwSize = (DWORD)(wcslen(buffer) * sizeof(WCHAR));
|
dwSize = (DWORD)((wcslen(buffer) + 1) * sizeof(WCHAR));
|
||||||
RegSetValueExW(hKeyEventVwr, L"Window", 0, REG_SZ, (LPBYTE)buffer, dwSize);
|
RegSetValueExW(hKeyEventVwr, L"Window", 0, REG_SZ, (LPBYTE)buffer, dwSize);
|
||||||
|
|
||||||
Quit:
|
Quit:
|
||||||
|
@ -855,7 +859,7 @@ GetMessageStringFromDllList(
|
||||||
szMessageDllList = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, cbLength);
|
szMessageDllList = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, cbLength);
|
||||||
if (!szMessageDllList)
|
if (!szMessageDllList)
|
||||||
return NULL;
|
return NULL;
|
||||||
RtlCopyMemory(szMessageDllList, lpMessageDllList, cbLength);
|
CopyMemory(szMessageDllList, lpMessageDllList, cbLength);
|
||||||
|
|
||||||
/* Loop through the list of message DLLs */
|
/* Loop through the list of message DLLs */
|
||||||
szDll = wcstok(szMessageDllList, EVENT_DLL_SEPARATOR);
|
szDll = wcstok(szMessageDllList, EVENT_DLL_SEPARATOR);
|
||||||
|
@ -1346,7 +1350,7 @@ AllocAndCopyMultiStr(IN PCWSTR MultiStr OPTIONAL)
|
||||||
pStr = HeapAlloc(GetProcessHeap(), 0, Length * sizeof(WCHAR));
|
pStr = HeapAlloc(GetProcessHeap(), 0, Length * sizeof(WCHAR));
|
||||||
// NOTE: If we failed allocating the string, then fall back into no filter!
|
// NOTE: If we failed allocating the string, then fall back into no filter!
|
||||||
if (pStr)
|
if (pStr)
|
||||||
RtlCopyMemory(pStr, MultiStr, Length * sizeof(WCHAR));
|
CopyMemory(pStr, MultiStr, Length * sizeof(WCHAR));
|
||||||
|
|
||||||
return pStr;
|
return pStr;
|
||||||
}
|
}
|
||||||
|
@ -1386,7 +1390,7 @@ AllocEventLogFilter(// IN PCWSTR FilterName,
|
||||||
|
|
||||||
/* Copy the list of event logs */
|
/* Copy the list of event logs */
|
||||||
EventLogFilter->NumOfEventLogs = NumOfEventLogs;
|
EventLogFilter->NumOfEventLogs = NumOfEventLogs;
|
||||||
RtlCopyMemory(EventLogFilter->EventLogs, EventLogs, NumOfEventLogs * sizeof(PEVENTLOG));
|
CopyMemory(EventLogFilter->EventLogs, EventLogs, NumOfEventLogs * sizeof(PEVENTLOG));
|
||||||
|
|
||||||
/* Initialize the filter reference count */
|
/* Initialize the filter reference count */
|
||||||
EventLogFilter->ReferenceCount = 1;
|
EventLogFilter->ReferenceCount = 1;
|
||||||
|
@ -1508,7 +1512,7 @@ GetExpandedFilePathName(
|
||||||
lpFullFileName[1] = L'$';
|
lpFullFileName[1] = L'$';
|
||||||
|
|
||||||
/* Prepend the computer name */
|
/* Prepend the computer name */
|
||||||
RtlMoveMemory(lpFullFileName + 2 + wcslen(ComputerName) + 1,
|
MoveMemory(lpFullFileName + 2 + wcslen(ComputerName) + 1,
|
||||||
lpFullFileName, dwLength * sizeof(WCHAR) - (2 + wcslen(ComputerName) + 1) * sizeof(WCHAR));
|
lpFullFileName, dwLength * sizeof(WCHAR) - (2 + wcslen(ComputerName) + 1) * sizeof(WCHAR));
|
||||||
lpFullFileName[0] = L'\\';
|
lpFullFileName[0] = L'\\';
|
||||||
lpFullFileName[1] = L'\\';
|
lpFullFileName[1] = L'\\';
|
||||||
|
@ -1699,7 +1703,7 @@ GetEventMessage(IN LPCWSTR KeyName,
|
||||||
{
|
{
|
||||||
if (iswdigit(lpMsgBuf[2]))
|
if (iswdigit(lpMsgBuf[2]))
|
||||||
{
|
{
|
||||||
RtlMoveMemory(lpMsgBuf, lpMsgBuf+1, ((szStringArray + cch) - lpMsgBuf - 1) * sizeof(WCHAR));
|
MoveMemory(lpMsgBuf, lpMsgBuf+1, ((szStringArray + cch) - lpMsgBuf - 1) * sizeof(WCHAR));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2198,7 +2202,7 @@ EnumEventsThread(IN LPVOID lpParameter)
|
||||||
StringCbPrintfW(szCategoryID, sizeof(szCategoryID), L"%u", pEvlrTmp->EventCategory);
|
StringCbPrintfW(szCategoryID, sizeof(szCategoryID), L"%u", pEvlrTmp->EventCategory);
|
||||||
|
|
||||||
g_RecordPtrs[dwCurrentRecord] = HeapAlloc(hProcessHeap, 0, pEvlrTmp->Length);
|
g_RecordPtrs[dwCurrentRecord] = HeapAlloc(hProcessHeap, 0, pEvlrTmp->Length);
|
||||||
RtlCopyMemory(g_RecordPtrs[dwCurrentRecord], pEvlrTmp, pEvlrTmp->Length);
|
CopyMemory(g_RecordPtrs[dwCurrentRecord], pEvlrTmp, pEvlrTmp->Length);
|
||||||
|
|
||||||
lviEventItem.mask = LVIF_IMAGE | LVIF_TEXT | LVIF_PARAM;
|
lviEventItem.mask = LVIF_IMAGE | LVIF_TEXT | LVIF_PARAM;
|
||||||
lviEventItem.iItem = 0;
|
lviEventItem.iItem = 0;
|
||||||
|
|
|
@ -10,13 +10,17 @@
|
||||||
#ifndef _EVENTVWR_PCH_
|
#ifndef _EVENTVWR_PCH_
|
||||||
#define _EVENTVWR_PCH_
|
#define _EVENTVWR_PCH_
|
||||||
|
|
||||||
// #pragma once
|
#pragma once
|
||||||
|
|
||||||
|
/* C Headers */
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
#define WIN32_NO_STATUS
|
#include <assert.h>
|
||||||
|
#define ASSERT(x) assert(x)
|
||||||
|
|
||||||
|
/* PSDK Headers */
|
||||||
|
#define WIN32_NO_STATUS
|
||||||
#include <windef.h>
|
#include <windef.h>
|
||||||
#include <winbase.h>
|
#include <winbase.h>
|
||||||
#include <wingdi.h>
|
#include <wingdi.h>
|
||||||
|
@ -24,7 +28,7 @@
|
||||||
#include <winnls.h>
|
#include <winnls.h>
|
||||||
#include <winreg.h>
|
#include <winreg.h>
|
||||||
|
|
||||||
#include <ndk/rtlfuncs.h>
|
#include <ndk/rtlfuncs.h> // For linked-lists.
|
||||||
|
|
||||||
#define ROUND_DOWN(n, align) (((ULONG)n) & ~((align) - 1l))
|
#define ROUND_DOWN(n, align) (((ULONG)n) & ~((align) - 1l))
|
||||||
#define ROUND_UP(n, align) ROUND_DOWN(((ULONG)n) + (align) - 1, (align))
|
#define ROUND_UP(n, align) ROUND_DOWN(((ULONG)n) + (align) - 1, (align))
|
||||||
|
|
Loading…
Reference in a new issue