[SHELL32] SHChangeNotify: Use tree for CDirectoryList (#6784)
[reactos.git] / base / applications / regedit / edit.c
index 84ae0ab..786eefc 100644 (file)
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
-#include <regedit.h>
+#include "regedit.h"
+
+#define NTOS_MODE_USER
+#include <ndk/cmtypes.h>
+
+#if defined(NT_PROCESSOR_GROUPS)
+
+typedef USHORT IRQ_DEVICE_POLICY, *PIRQ_DEVICE_POLICY;
+
+enum _IRQ_DEVICE_POLICY_USHORT {
+  IrqPolicyMachineDefault = 0,
+  IrqPolicyAllCloseProcessors = 1,
+  IrqPolicyOneCloseProcessor = 2,
+  IrqPolicyAllProcessorsInMachine = 3,
+  IrqPolicyAllProcessorsInGroup = 3,
+  IrqPolicySpecifiedProcessors = 4,
+  IrqPolicySpreadMessagesAcrossAllProcessors = 5};
+
+#else /* defined(NT_PROCESSOR_GROUPS) */
+
+typedef enum _IRQ_DEVICE_POLICY {
+  IrqPolicyMachineDefault = 0,
+  IrqPolicyAllCloseProcessors,
+  IrqPolicyOneCloseProcessor,
+  IrqPolicyAllProcessorsInMachine,
+  IrqPolicySpecifiedProcessors,
+  IrqPolicySpreadMessagesAcrossAllProcessors
+} IRQ_DEVICE_POLICY, *PIRQ_DEVICE_POLICY;
+
+#endif
+
+typedef enum _IRQ_PRIORITY {
+  IrqPriorityUndefined = 0,
+  IrqPriorityLow,
+  IrqPriorityNormal,
+  IrqPriorityHigh
+} IRQ_PRIORITY, *PIRQ_PRIORITY;
+typedef struct _IO_RESOURCE_DESCRIPTOR {
+  UCHAR Option;
+  UCHAR Type;
+  UCHAR ShareDisposition;
+  UCHAR Spare1;
+  USHORT Flags;
+  USHORT Spare2;
+  union {
+    struct {
+      ULONG Length;
+      ULONG Alignment;
+      PHYSICAL_ADDRESS MinimumAddress;
+      PHYSICAL_ADDRESS MaximumAddress;
+    } Port;
+    struct {
+      ULONG Length;
+      ULONG Alignment;
+      PHYSICAL_ADDRESS MinimumAddress;
+      PHYSICAL_ADDRESS MaximumAddress;
+    } Memory;
+    struct {
+      ULONG MinimumVector;
+      ULONG MaximumVector;
+#if defined(NT_PROCESSOR_GROUPS)
+      IRQ_DEVICE_POLICY AffinityPolicy;
+      USHORT Group;
+#else
+      IRQ_DEVICE_POLICY AffinityPolicy;
+#endif
+      IRQ_PRIORITY PriorityPolicy;
+      KAFFINITY TargetedProcessors;
+    } Interrupt;
+    struct {
+      ULONG MinimumChannel;
+      ULONG MaximumChannel;
+    } Dma;
+    struct {
+      ULONG Length;
+      ULONG Alignment;
+      PHYSICAL_ADDRESS MinimumAddress;
+      PHYSICAL_ADDRESS MaximumAddress;
+    } Generic;
+    struct {
+      ULONG Data[3];
+    } DevicePrivate;
+    struct {
+      ULONG Length;
+      ULONG MinBusNumber;
+      ULONG MaxBusNumber;
+      ULONG Reserved;
+    } BusNumber;
+    struct {
+      ULONG Priority;
+      ULONG Reserved1;
+      ULONG Reserved2;
+    } ConfigData;
+  } u;
+} IO_RESOURCE_DESCRIPTOR, *PIO_RESOURCE_DESCRIPTOR;
+
+#define IO_RESOURCE_PREFERRED             0x01
+#define IO_RESOURCE_DEFAULT               0x02
+#define IO_RESOURCE_ALTERNATIVE           0x08
+
+typedef struct _IO_RESOURCE_LIST {
+  USHORT Version;
+  USHORT Revision;
+  ULONG Count;
+  IO_RESOURCE_DESCRIPTOR Descriptors[1];
+} IO_RESOURCE_LIST, *PIO_RESOURCE_LIST;
+
+typedef struct _IO_RESOURCE_REQUIREMENTS_LIST {
+  ULONG ListSize;
+  INTERFACE_TYPE InterfaceType;
+  ULONG BusNumber;
+  ULONG SlotNumber;
+  ULONG Reserved[3];
+  ULONG AlternativeLists;
+  IO_RESOURCE_LIST List[1];
+} IO_RESOURCE_REQUIREMENTS_LIST, *PIO_RESOURCE_REQUIREMENTS_LIST;
 
 typedef enum _EDIT_MODE
 {
@@ -27,72 +142,74 @@ typedef enum _EDIT_MODE
 } EDIT_MODE;
 
 
-static const TCHAR* editValueName;
-static TCHAR* stringValueData;
+static const WCHAR* editValueName;
+static WCHAR* stringValueData;
 static PVOID binValueData;
 static DWORD dwordValueData;
 static PCM_RESOURCE_LIST resourceValueData;
 static INT fullResourceIndex = -1;
 static DWORD valueDataLen;
+static PIO_RESOURCE_REQUIREMENTS_LIST requirementsValueData;
+static INT requirementsIndex = -1;
 static EDIT_MODE dwordEditMode = EDIT_MODE_HEX;
 
 void error(HWND hwnd, INT resId, ...)
 {
     va_list ap;
-    TCHAR title[256];
-    TCHAR errfmt[1024];
-    TCHAR errstr[1024];
+    WCHAR title[256];
+    WCHAR errfmt[1024];
+    WCHAR errstr[1024];
     HINSTANCE hInstance;
 
     hInstance = GetModuleHandle(0);
 
-    if (!LoadString(hInstance, IDS_ERROR, title, COUNT_OF(title)))
-        _tcscpy(title, _T("Error"));
+    if (!LoadStringW(hInstance, IDS_ERROR, title, ARRAY_SIZE(title)))
+        StringCbCopyW(title, sizeof(title), L"Error");
 
-    if (!LoadString(hInstance, resId, errfmt, COUNT_OF(errfmt)))
-        _tcscpy(errfmt, _T("Unknown error string!"));
+    if (!LoadStringW(hInstance, resId, errfmt, ARRAY_SIZE(errfmt)))
+        StringCbCopyW(errfmt, sizeof(errfmt), L"Unknown error string!");
 
     va_start(ap, resId);
-    _vsntprintf(errstr, COUNT_OF(errstr), errfmt, ap);
+    _vsnwprintf(errstr, ARRAY_SIZE(errstr), errfmt, ap);
     va_end(ap);
 
-    MessageBox(hwnd, errstr, title, MB_OK | MB_ICONERROR);
+    MessageBoxW(hwnd, errstr, title, MB_OK | MB_ICONERROR);
 }
 
 static void error_code_messagebox(HWND hwnd, DWORD error_code)
 {
-    TCHAR title[256];
-    if (!LoadString(hInst, IDS_ERROR, title, COUNT_OF(title)))
-        lstrcpy(title, TEXT("Error"));
+    WCHAR title[256];
+    if (!LoadStringW(hInst, IDS_ERROR, title, ARRAY_SIZE(title)))
+        StringCbCopyW(title, sizeof(title), L"Error");
     ErrorMessageBox(hwnd, title, error_code);
 }
 
 void warning(HWND hwnd, INT resId, ...)
 {
     va_list ap;
-    TCHAR title[256];
-    TCHAR errfmt[1024];
-    TCHAR errstr[1024];
+    WCHAR title[256];
+    WCHAR errfmt[1024];
+    WCHAR errstr[1024];
     HINSTANCE hInstance;
 
     hInstance = GetModuleHandle(0);
 
-    if (!LoadString(hInstance, IDS_WARNING, title, COUNT_OF(title)))
-        _tcscpy(title, _T("Warning"));
+    if (!LoadStringW(hInstance, IDS_WARNING, title, ARRAY_SIZE(title)))
+        StringCbCopyW(title, sizeof(title), L"Warning");
 
-    if (!LoadString(hInstance, resId, errfmt, COUNT_OF(errfmt)))
-        _tcscpy(errfmt, _T("Unknown error string!"));
+    if (!LoadStringW(hInstance, resId, errfmt, ARRAY_SIZE(errfmt)))
+        StringCbCopyW(errfmt, sizeof(errfmt), L"Unknown error string!");
 
     va_start(ap, resId);
-    _vsntprintf(errstr, COUNT_OF(errstr), errfmt, ap);
+    StringCbVPrintfW(errstr, sizeof(errstr), errfmt, ap);
     va_end(ap);
 
-    MessageBox(hwnd, errstr, title, MB_OK | MB_ICONSTOP);
+    MessageBoxW(hwnd, errstr, title, MB_OK | MB_ICONSTOP);
 }
 
 INT_PTR CALLBACK modify_string_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
 {
-    TCHAR* valueData;
+    WCHAR* valueData;
     HWND hwndValue;
     int len;
 
@@ -101,17 +218,18 @@ INT_PTR CALLBACK modify_string_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, L
     switch(uMsg)
     {
     case WM_INITDIALOG:
-        if(editValueName && _tcscmp(editValueName, _T("")))
+        if (editValueName && wcscmp(editValueName, L""))
         {
-            SetDlgItemText(hwndDlg, IDC_VALUE_NAME, editValueName);
+            SetDlgItemTextW(hwndDlg, IDC_VALUE_NAME, editValueName);
         }
         else
         {
-            TCHAR buffer[255];
-            LoadString(hInst, IDS_DEFAULT_VALUE_NAME, buffer, sizeof(buffer)/sizeof(TCHAR));
-            SetDlgItemText(hwndDlg, IDC_VALUE_NAME, buffer);
+            WCHAR buffer[255];
+            LoadStringW(hInst, IDS_DEFAULT_VALUE_NAME, buffer, ARRAY_SIZE(buffer));
+            SetDlgItemTextW(hwndDlg, IDC_VALUE_NAME, buffer);
         }
-        SetDlgItemText(hwndDlg, IDC_VALUE_DATA, stringValueData);
+        SetDlgItemTextW(hwndDlg, IDC_VALUE_DATA, stringValueData);
+        SendMessage(GetDlgItem(hwndDlg, IDC_VALUE_DATA), EM_SETSEL, 0, -1);
         SetFocus(GetDlgItem(hwndDlg, IDC_VALUE_DATA));
         return FALSE;
     case WM_COMMAND:
@@ -124,19 +242,19 @@ INT_PTR CALLBACK modify_string_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, L
                 {
                     if (stringValueData)
                     {
-                        if ((valueData = HeapReAlloc(GetProcessHeap(), 0, stringValueData, (len + 1) * sizeof(TCHAR))))
+                        if ((valueData = HeapReAlloc(GetProcessHeap(), 0, stringValueData, (len + 1) * sizeof(WCHAR))))
                         {
                             stringValueData = valueData;
-                            if (!GetWindowText(hwndValue, stringValueData, len + 1))
+                            if (!GetWindowTextW(hwndValue, stringValueData, len + 1))
                                 *stringValueData = 0;
                         }
                     }
                     else
                     {
-                        if ((valueData = HeapAlloc(GetProcessHeap(), 0, (len + 1) * sizeof(TCHAR))))
+                        if ((valueData = HeapAlloc(GetProcessHeap(), 0, (len + 1) * sizeof(WCHAR))))
                         {
                             stringValueData = valueData;
-                            if (!GetWindowText(hwndValue, stringValueData, len + 1))
+                            if (!GetWindowTextW(hwndValue, stringValueData, len + 1))
                                 *stringValueData = 0;
                         }
                     }
@@ -160,7 +278,7 @@ INT_PTR CALLBACK modify_string_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, L
 
 INT_PTR CALLBACK modify_multi_string_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
 {
-    TCHAR* valueData;
+    WCHAR* valueData;
     HWND hwndValue;
     int len;
 
@@ -169,17 +287,17 @@ INT_PTR CALLBACK modify_multi_string_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wPa
     switch(uMsg)
     {
     case WM_INITDIALOG:
-        if(editValueName && _tcscmp(editValueName, _T("")))
+        if (editValueName && wcscmp(editValueName, L""))
         {
-            SetDlgItemText(hwndDlg, IDC_VALUE_NAME, editValueName);
+            SetDlgItemTextW(hwndDlg, IDC_VALUE_NAME, editValueName);
         }
         else
         {
-            TCHAR buffer[255];
-            LoadString(hInst, IDS_DEFAULT_VALUE_NAME, buffer, sizeof(buffer)/sizeof(TCHAR));
-            SetDlgItemText(hwndDlg, IDC_VALUE_NAME, buffer);
+            WCHAR buffer[255];
+            LoadStringW(hInst, IDS_DEFAULT_VALUE_NAME, buffer, ARRAY_SIZE(buffer));
+            SetDlgItemTextW(hwndDlg, IDC_VALUE_NAME, buffer);
         }
-        SetDlgItemText(hwndDlg, IDC_VALUE_DATA, stringValueData);
+        SetDlgItemTextW(hwndDlg, IDC_VALUE_DATA, stringValueData);
         SetFocus(GetDlgItem(hwndDlg, IDC_VALUE_DATA));
         return FALSE;
     case WM_COMMAND:
@@ -192,19 +310,19 @@ INT_PTR CALLBACK modify_multi_string_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wPa
                 {
                     if (stringValueData)
                     {
-                        if ((valueData = HeapReAlloc(GetProcessHeap(), 0, stringValueData, (len + 1) * sizeof(TCHAR))))
+                        if ((valueData = HeapReAlloc(GetProcessHeap(), 0, stringValueData, (len + 1) * sizeof(WCHAR))))
                         {
                             stringValueData = valueData;
-                            if (!GetWindowText(hwndValue, stringValueData, len + 1))
+                            if (!GetWindowTextW(hwndValue, stringValueData, len + 1))
                                 *stringValueData = 0;
                         }
                     }
                     else
                     {
-                        if ((valueData = HeapAlloc(GetProcessHeap(), 0, (len + 1) * sizeof(TCHAR))))
+                        if ((valueData = HeapAlloc(GetProcessHeap(), 0, (len + 1) * sizeof(WCHAR))))
                         {
                             stringValueData = valueData;
-                            if (!GetWindowText(hwndValue, stringValueData, len + 1))
+                            if (!GetWindowTextW(hwndValue, stringValueData, len + 1))
                                 *stringValueData = 0;
                         }
                     }
@@ -230,7 +348,7 @@ LRESULT CALLBACK DwordEditSubclassProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPAR
 {
     WNDPROC oldwndproc;
 
-    oldwndproc = (WNDPROC)(LONG_PTR)GetWindowLongPtr(hwnd, GWL_USERDATA);
+    oldwndproc = (WNDPROC)GetWindowLongPtr(hwnd, GWLP_USERDATA);
 
     switch (uMsg)
     {
@@ -263,7 +381,7 @@ LRESULT CALLBACK DwordEditSubclassProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPAR
         }
     }
 
-    return CallWindowProc(oldwndproc, hwnd, uMsg, wParam, lParam);
+    return CallWindowProcW(oldwndproc, hwnd, uMsg, wParam, lParam);
 }
 
 
@@ -271,8 +389,8 @@ INT_PTR CALLBACK modify_dword_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LP
 {
     WNDPROC oldproc;
     HWND hwndValue;
-    TCHAR ValueString[32];
-    LPTSTR Remainder;
+    WCHAR ValueString[32];
+    LPWSTR Remainder;
     DWORD Base;
     DWORD Value = 0;
 
@@ -285,23 +403,24 @@ INT_PTR CALLBACK modify_dword_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LP
 
         /* subclass the edit control */
         hwndValue = GetDlgItem(hwndDlg, IDC_VALUE_DATA);
-        oldproc = (WNDPROC)(LONG_PTR)GetWindowLongPtr(hwndValue, GWL_WNDPROC);
-        SetWindowLongPtr(hwndValue, GWL_USERDATA, (DWORD_PTR)oldproc);
-        SetWindowLongPtr(hwndValue, GWL_WNDPROC, (DWORD_PTR)DwordEditSubclassProc);
+        oldproc = (WNDPROC)GetWindowLongPtr(hwndValue, GWLP_WNDPROC);
+        SetWindowLongPtr(hwndValue, GWLP_USERDATA, (DWORD_PTR)oldproc);
+        SetWindowLongPtr(hwndValue, GWLP_WNDPROC, (DWORD_PTR)DwordEditSubclassProc);
 
-        if(editValueName && _tcscmp(editValueName, _T("")))
+        if (editValueName && wcscmp(editValueName, L""))
         {
-            SetDlgItemText(hwndDlg, IDC_VALUE_NAME, editValueName);
+            SetDlgItemTextW(hwndDlg, IDC_VALUE_NAME, editValueName);
         }
         else
         {
-            TCHAR buffer[255];
-            LoadString(hInst, IDS_DEFAULT_VALUE_NAME, buffer, sizeof(buffer)/sizeof(TCHAR));
-            SetDlgItemText(hwndDlg, IDC_VALUE_NAME, buffer);
+            WCHAR buffer[255];
+            LoadStringW(hInst, IDS_DEFAULT_VALUE_NAME, buffer, ARRAY_SIZE(buffer));
+            SetDlgItemTextW(hwndDlg, IDC_VALUE_NAME, buffer);
         }
         CheckRadioButton (hwndDlg, IDC_FORMAT_HEX, IDC_FORMAT_DEC, IDC_FORMAT_HEX);
-        _stprintf (ValueString, _T("%lx"), dwordValueData);
-        SetDlgItemText(hwndDlg, IDC_VALUE_DATA, ValueString);
+        StringCbPrintfW(ValueString, sizeof(ValueString), L"%lx", dwordValueData);
+        SetDlgItemTextW(hwndDlg, IDC_VALUE_DATA, ValueString);
+        SendMessage(GetDlgItem(hwndDlg, IDC_VALUE_DATA), EM_SETSEL, 0, -1);
         SetFocus(GetDlgItem(hwndDlg, IDC_VALUE_DATA));
         return FALSE;
 
@@ -316,14 +435,14 @@ INT_PTR CALLBACK modify_dword_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LP
                 {
                     if (GetWindowTextLength(hwndValue))
                     {
-                        if (GetWindowText(hwndValue, ValueString, 32))
+                        if (GetWindowTextW(hwndValue, ValueString, 32))
                         {
-                            Value = _tcstoul (ValueString, &Remainder, 10);
+                            Value = wcstoul (ValueString, &Remainder, 10);
                         }
                     }
                 }
-                _stprintf (ValueString, _T("%lx"), Value);
-                SetDlgItemText(hwndDlg, IDC_VALUE_DATA, ValueString);
+                StringCbPrintfW(ValueString, sizeof(ValueString), L"%lx", Value);
+                SetDlgItemTextW(hwndDlg, IDC_VALUE_DATA, ValueString);
                 return TRUE;
             }
             break;
@@ -336,14 +455,14 @@ INT_PTR CALLBACK modify_dword_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LP
                 {
                     if (GetWindowTextLength(hwndValue))
                     {
-                        if (GetWindowText(hwndValue, ValueString, 32))
+                        if (GetWindowTextW(hwndValue, ValueString, 32))
                         {
-                            Value = _tcstoul (ValueString, &Remainder, 16);
+                            Value = wcstoul (ValueString, &Remainder, 16);
                         }
                     }
                 }
-                _stprintf (ValueString, _T("%lu"), Value);
-                SetDlgItemText(hwndDlg, IDC_VALUE_DATA, ValueString);
+                StringCbPrintfW(ValueString, sizeof(ValueString), L"%lu", Value);
+                SetDlgItemTextW(hwndDlg, IDC_VALUE_DATA, ValueString);
                 return TRUE;
             }
             break;
@@ -353,14 +472,14 @@ INT_PTR CALLBACK modify_dword_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LP
             {
                 if (GetWindowTextLength(hwndValue))
                 {
-                    if (!GetWindowText(hwndValue, ValueString, 32))
+                    if (!GetWindowTextW(hwndValue, ValueString, 32))
                     {
                         EndDialog(hwndDlg, IDCANCEL);
                         return TRUE;
                     }
 
                     Base = (dwordEditMode == EDIT_MODE_HEX) ? 16 : 10;
-                    dwordValueData = _tcstoul (ValueString, &Remainder, Base);
+                    dwordValueData = wcstoul (ValueString, &Remainder, Base);
                 }
                 else
                 {
@@ -390,20 +509,20 @@ INT_PTR CALLBACK modify_binary_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, L
     switch(uMsg)
     {
     case WM_INITDIALOG:
-        if(editValueName && _tcscmp(editValueName, _T("")))
+        if (editValueName && wcscmp(editValueName, L""))
         {
-            SetDlgItemText(hwndDlg, IDC_VALUE_NAME, editValueName);
+            SetDlgItemTextW(hwndDlg, IDC_VALUE_NAME, editValueName);
         }
         else
         {
-            TCHAR buffer[255];
-            LoadString(hInst, IDS_DEFAULT_VALUE_NAME, buffer, sizeof(buffer)/sizeof(TCHAR));
-            SetDlgItemText(hwndDlg, IDC_VALUE_NAME, buffer);
+            WCHAR buffer[255];
+            LoadStringW(hInst, IDS_DEFAULT_VALUE_NAME, buffer, ARRAY_SIZE(buffer));
+            SetDlgItemTextW(hwndDlg, IDC_VALUE_NAME, buffer);
         }
         hwndValue = GetDlgItem(hwndDlg, IDC_VALUE_DATA);
         HexEdit_LoadBuffer(hwndValue, binValueData, valueDataLen);
         /* reset the hex edit control's font */
-        SendMessage(hwndValue, WM_SETFONT, 0, 0);
+        SendMessageW(hwndValue, WM_SETFONT, 0, 0);
         SetFocus(hwndValue);
         return FALSE;
     case WM_COMMAND:
@@ -433,9 +552,9 @@ INT_PTR CALLBACK modify_binary_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, L
 
 static BOOL CreateResourceColumns(HWND hwnd)
 {
-    TCHAR szText[80];
+    WCHAR szText[80];
     RECT rc;
-    LV_COLUMN lvC;
+    LVCOLUMN lvC;
     HWND hwndLV;
     INT width;
 
@@ -451,13 +570,13 @@ static BOOL CreateResourceColumns(HWND hwnd)
     /* Load the column labels from the resource file. */
     lvC.iSubItem = 0;
     lvC.cx = (rc.right - rc.left) / 2;
-    LoadString(hInst, IDS_DMA_CHANNEL, szText, sizeof(szText)/sizeof(TCHAR));
+    LoadStringW(hInst, IDS_DMA_CHANNEL, szText, ARRAY_SIZE(szText));
     if (ListView_InsertColumn(hwndLV, 0, &lvC) == -1)
         return FALSE;
 
     lvC.iSubItem = 1;
     lvC.cx = (rc.right - rc.left) - lvC.cx;
-    LoadString(hInst, IDS_DMA_PORT, szText, sizeof(szText)/sizeof(TCHAR));
+    LoadStringW(hInst, IDS_DMA_PORT, szText, ARRAY_SIZE(szText));
     if (ListView_InsertColumn(hwndLV, 1, &lvC) == -1)
         return FALSE;
 
@@ -471,23 +590,23 @@ static BOOL CreateResourceColumns(HWND hwnd)
     /* Load the column labels from the resource file. */
     lvC.iSubItem = 0;
     lvC.cx = width;
-    LoadString(hInst, IDS_INTERRUPT_VECTOR, szText, sizeof(szText)/sizeof(TCHAR));
+    LoadStringW(hInst, IDS_INTERRUPT_VECTOR, szText, ARRAY_SIZE(szText));
     if (ListView_InsertColumn(hwndLV, 0, &lvC) == -1)
         return FALSE;
 
     lvC.iSubItem = 1;
-    LoadString(hInst, IDS_INTERRUPT_LEVEL, szText, sizeof(szText)/sizeof(TCHAR));
+    LoadStringW(hInst, IDS_INTERRUPT_LEVEL, szText, ARRAY_SIZE(szText));
     if (ListView_InsertColumn(hwndLV, 1, &lvC) == -1)
         return FALSE;
 
     lvC.iSubItem = 2;
-    LoadString(hInst, IDS_INTERRUPT_AFFINITY, szText, sizeof(szText)/sizeof(TCHAR));
+    LoadStringW(hInst, IDS_INTERRUPT_AFFINITY, szText, ARRAY_SIZE(szText));
     if (ListView_InsertColumn(hwndLV, 2, &lvC) == -1)
         return FALSE;
 
     lvC.iSubItem = 3;
     lvC.cx = (rc.right - rc.left) - 3 * width;
-    LoadString(hInst, IDS_INTERRUPT_TYPE, szText, sizeof(szText)/sizeof(TCHAR));
+    LoadStringW(hInst, IDS_INTERRUPT_TYPE, szText, ARRAY_SIZE(szText));
     if (ListView_InsertColumn(hwndLV, 3, &lvC) == -1)
         return FALSE;
 
@@ -501,18 +620,18 @@ static BOOL CreateResourceColumns(HWND hwnd)
     /* Load the column labels from the resource file. */
     lvC.iSubItem = 0;
     lvC.cx = width;
-    LoadString(hInst, IDS_MEMORY_ADDRESS, szText, sizeof(szText)/sizeof(TCHAR));
+    LoadStringW(hInst, IDS_MEMORY_ADDRESS, szText, ARRAY_SIZE(szText));
     if (ListView_InsertColumn(hwndLV, 0, &lvC) == -1)
         return FALSE;
 
     lvC.iSubItem = 1;
-    LoadString(hInst, IDS_MEMORY_LENGTH, szText, sizeof(szText)/sizeof(TCHAR));
+    LoadStringW(hInst, IDS_MEMORY_LENGTH, szText, ARRAY_SIZE(szText));
     if (ListView_InsertColumn(hwndLV, 1, &lvC) == -1)
         return FALSE;
 
     lvC.iSubItem = 2;
     lvC.cx = (rc.right - rc.left) - 2 * width;
-    LoadString(hInst, IDS_MEMORY_ACCESS, szText, sizeof(szText)/sizeof(TCHAR));
+    LoadStringW(hInst, IDS_MEMORY_ACCESS, szText, ARRAY_SIZE(szText));
     if (ListView_InsertColumn(hwndLV, 2, &lvC) == -1)
         return FALSE;
 
@@ -526,18 +645,18 @@ static BOOL CreateResourceColumns(HWND hwnd)
     /* Load the column labels from the resource file. */
     lvC.iSubItem = 0;
     lvC.cx = width;
-    LoadString(hInst, IDS_PORT_ADDRESS, szText, sizeof(szText)/sizeof(TCHAR));
+    LoadStringW(hInst, IDS_PORT_ADDRESS, szText, ARRAY_SIZE(szText));
     if (ListView_InsertColumn(hwndLV, 0, &lvC) == -1)
         return FALSE;
 
     lvC.iSubItem = 1;
-    LoadString(hInst, IDS_PORT_LENGTH, szText, sizeof(szText)/sizeof(TCHAR));
+    LoadStringW(hInst, IDS_PORT_LENGTH, szText, ARRAY_SIZE(szText));
     if (ListView_InsertColumn(hwndLV, 1, &lvC) == -1)
         return FALSE;
 
     lvC.iSubItem = 2;
     lvC.cx = (rc.right - rc.left) - 2 * width;
-    LoadString(hInst, IDS_PORT_ACCESS, szText, sizeof(szText)/sizeof(TCHAR));
+    LoadStringW(hInst, IDS_PORT_ACCESS, szText, ARRAY_SIZE(szText));
     if (ListView_InsertColumn(hwndLV, 2, &lvC) == -1)
         return FALSE;
 
@@ -550,18 +669,18 @@ static BOOL CreateResourceColumns(HWND hwnd)
     /* Load the column labels from the resource file. */
     lvC.iSubItem = 0;
     lvC.cx = width;
-    LoadString(hInst, IDS_SPECIFIC_RESERVED1, szText, sizeof(szText)/sizeof(TCHAR));
+    LoadStringW(hInst, IDS_SPECIFIC_RESERVED1, szText, ARRAY_SIZE(szText));
     if (ListView_InsertColumn(hwndLV, 0, &lvC) == -1)
         return FALSE;
 
     lvC.iSubItem = 1;
-    LoadString(hInst, IDS_SPECIFIC_RESERVED2, szText, sizeof(szText)/sizeof(TCHAR));
+    LoadStringW(hInst, IDS_SPECIFIC_RESERVED2, szText, ARRAY_SIZE(szText));
     if (ListView_InsertColumn(hwndLV, 1, &lvC) == -1)
         return FALSE;
 
     lvC.iSubItem = 2;
     lvC.cx = (rc.right - rc.left) - 2 * width;
-    LoadString(hInst, IDS_SPECIFIC_DATASIZE, szText, sizeof(szText)/sizeof(TCHAR));
+    LoadStringW(hInst, IDS_SPECIFIC_DATASIZE, szText, ARRAY_SIZE(szText));
     if (ListView_InsertColumn(hwndLV, 2, &lvC) == -1)
         return FALSE;
 
@@ -570,88 +689,88 @@ static BOOL CreateResourceColumns(HWND hwnd)
 
 static VOID
 GetInterfaceType(INTERFACE_TYPE InterfaceType,
-                 LPTSTR pBuffer,
+                 LPWSTR pBuffer,
                  DWORD dwLength)
 {
-//    LPTSTR lpInterfaceType;
+//    LPWSTR lpInterfaceType;
 
     switch (InterfaceType)
     {
         case InterfaceTypeUndefined:
-            LoadString(hInst, IDS_BUS_UNDEFINED, pBuffer, dwLength);
-//            lpInterfaceType = _T("Undefined");
+            LoadStringW(hInst, IDS_BUS_UNDEFINED, pBuffer, dwLength);
+//            lpInterfaceType = L"Undefined";
             break;
         case Internal:
-            LoadString(hInst, IDS_BUS_INTERNAL, pBuffer, dwLength);
-//            lpInterfaceType = _T("Internal");
+            LoadStringW(hInst, IDS_BUS_INTERNAL, pBuffer, dwLength);
+//            lpInterfaceType = L"Internal";
             break;
         case Isa:
-            LoadString(hInst, IDS_BUS_ISA, pBuffer, dwLength);
-//            lpInterfaceType = _T("Isa");
+            LoadStringW(hInst, IDS_BUS_ISA, pBuffer, dwLength);
+//            lpInterfaceType = L"Isa";
             break;
         case Eisa:
-            LoadString(hInst, IDS_BUS_EISA, pBuffer, dwLength);
-//            lpInterfaceType = _T("Eisa");
+            LoadStringW(hInst, IDS_BUS_EISA, pBuffer, dwLength);
+//            lpInterfaceType = L"Eisa";
             break;
         case MicroChannel:
-            LoadString(hInst, IDS_BUS_MICROCHANNEL, pBuffer, dwLength);
-//            lpInterfaceType = _T("MicroChannel");
+            LoadStringW(hInst, IDS_BUS_MICROCHANNEL, pBuffer, dwLength);
+//            lpInterfaceType = L"MicroChannel";
             break;
         case TurboChannel:
-            LoadString(hInst, IDS_BUS_TURBOCHANNEL, pBuffer, dwLength);
-//            lpInterfaceType = _T("TurboChannel");
+            LoadStringW(hInst, IDS_BUS_TURBOCHANNEL, pBuffer, dwLength);
+//            lpInterfaceType = L"TurboChannel";
             break;
         case PCIBus:
-            LoadString(hInst, IDS_BUS_PCIBUS, pBuffer, dwLength);
-//            lpInterfaceType = _T("PCIBus");
+            LoadStringW(hInst, IDS_BUS_PCIBUS, pBuffer, dwLength);
+//            lpInterfaceType = L"PCIBus";
             break;
         case VMEBus:
-            LoadString(hInst, IDS_BUS_VMEBUS, pBuffer, dwLength);
-//            lpInterfaceType = _T("VMEBus");
+            LoadStringW(hInst, IDS_BUS_VMEBUS, pBuffer, dwLength);
+//            lpInterfaceType = L"VMEBus";
             break;
         case NuBus:
-            LoadString(hInst, IDS_BUS_NUBUS, pBuffer, dwLength);
-//            lpInterfaceType = _T("NuBus");
+            LoadStringW(hInst, IDS_BUS_NUBUS, pBuffer, dwLength);
+//            lpInterfaceType = L"NuBus";
             break;
         case PCMCIABus:
-            LoadString(hInst, IDS_BUS_PCMCIABUS, pBuffer, dwLength);
-//            lpInterfaceType = _T("PCMCIABus");
+            LoadStringW(hInst, IDS_BUS_PCMCIABUS, pBuffer, dwLength);
+//            lpInterfaceType = L"PCMCIABus";
             break;
         case CBus:
-            LoadString(hInst, IDS_BUS_CBUS, pBuffer, dwLength);
-//            lpInterfaceType = _T("CBus");
+            LoadStringW(hInst, IDS_BUS_CBUS, pBuffer, dwLength);
+//            lpInterfaceType = L"CBus";
             break;
         case MPIBus:
-            LoadString(hInst, IDS_BUS_MPIBUS, pBuffer, dwLength);
-//            lpInterfaceType = _T("MPIBus");
+            LoadStringW(hInst, IDS_BUS_MPIBUS, pBuffer, dwLength);
+//            lpInterfaceType = L"MPIBus";
             break;
         case MPSABus:
-            LoadString(hInst, IDS_BUS_MPSABUS, pBuffer, dwLength);
-//            lpInterfaceType = _T("MPSABus");
+            LoadStringW(hInst, IDS_BUS_MPSABUS, pBuffer, dwLength);
+//            lpInterfaceType = L"MPSABus";
             break;
         case ProcessorInternal:
-            LoadString(hInst, IDS_BUS_PROCESSORINTERNAL, pBuffer, dwLength);
-//            lpInterfaceType = _T("ProcessorInternal");
+            LoadStringW(hInst, IDS_BUS_PROCESSORINTERNAL, pBuffer, dwLength);
+//            lpInterfaceType = L"ProcessorInternal";
             break;
         case InternalPowerBus:
-            LoadString(hInst, IDS_BUS_INTERNALPOWERBUS, pBuffer, dwLength);
-//            lpInterfaceType = _T("InternalPowerBus");
+            LoadStringW(hInst, IDS_BUS_INTERNALPOWERBUS, pBuffer, dwLength);
+//            lpInterfaceType = L"InternalPowerBus";
             break;
         case PNPISABus:
-            LoadString(hInst, IDS_BUS_PNPISABUS, pBuffer, dwLength);
-//            lpInterfaceType = _T("PNPISABus");
+            LoadStringW(hInst, IDS_BUS_PNPISABUS, pBuffer, dwLength);
+//            lpInterfaceType = L"PNPISABus";
             break;
         case PNPBus:
-            LoadString(hInst, IDS_BUS_PNPBUS, pBuffer, dwLength);
-//            lpInterfaceType = _T("PNPBus");
+            LoadStringW(hInst, IDS_BUS_PNPBUS, pBuffer, dwLength);
+//            lpInterfaceType = L"PNPBus";
             break;
         default:
-            LoadString(hInst, IDS_BUS_UNKNOWNTYPE, pBuffer, dwLength);
-//            lpInterfaceType = _T("Unknown interface type");
+            LoadStringW(hInst, IDS_BUS_UNKNOWNTYPE, pBuffer, dwLength);
+//            lpInterfaceType = L"Unknown interface type";
             break;
     }
 
-//    _tcscpy(pBuffer, lpInterfaceType);
+//    wcscpy(pBuffer, lpInterfaceType);
 }
 
 
@@ -664,19 +783,24 @@ ParseResources(HWND hwnd)
     ULONG i;
     HWND hwndLV;
 
-    TCHAR buffer[80];
-    LVITEM item;
+    WCHAR buffer[80];
+    LVITEMW item;
     INT iItem;
 
-    pFullDescriptor = &resourceValueData->List[fullResourceIndex];
+    pFullDescriptor = &resourceValueData->List[0];
+    for (i = 0; i < fullResourceIndex; i++)
+    {
+        pFullDescriptor = (PVOID)(pFullDescriptor->PartialResourceList.PartialDescriptors +
+                                  pFullDescriptor->PartialResourceList.Count);
+    }
     pPartialResourceList = &pFullDescriptor->PartialResourceList;
 
     /* Interface type */
     GetInterfaceType(pFullDescriptor->InterfaceType, buffer, 80);
-    SetDlgItemText(hwnd, IDC_INTERFACETYPE, buffer);
+    SetDlgItemTextW(hwnd, IDC_INTERFACETYPE, buffer);
 
     /* Busnumber */
-    SetDlgItemInt(hwnd, IDC_BUSNUMBER, (UINT)pFullDescriptor->BusNumber, FALSE);
+    SetDlgItemInt(hwnd, IDC_BUSNUMBER, (UINT)pFullDescriptor->BusNumber, TRUE);
 
     /* Version */
     SetDlgItemInt(hwnd, IDC_VERSION, (UINT)pPartialResourceList->Version, FALSE);
@@ -694,9 +818,9 @@ ParseResources(HWND hwnd)
                 hwndLV = GetDlgItem(hwnd, IDC_PORT_LIST);
 
 #ifdef _M_AMD64
-                wsprintf(buffer, _T("0x%16I64x"), pDescriptor->u.Port.Start.QuadPart);
+                wsprintf(buffer, L"0x%016I64x", pDescriptor->u.Port.Start.QuadPart);
 #else
-                wsprintf(buffer, _T("0x%08lx"), pDescriptor->u.Port.Start.u.LowPart);
+                wsprintf(buffer, L"0x%08lx", pDescriptor->u.Port.Start.u.LowPart);
 #endif
 
                 item.mask = LVIF_TEXT | LVIF_PARAM;
@@ -705,19 +829,19 @@ ParseResources(HWND hwnd)
                 item.state = 0;
                 item.stateMask = 0;
                 item.pszText = buffer;
-                item.cchTextMax = (int)_tcslen(item.pszText);
+                item.cchTextMax = (int)wcslen(item.pszText);
                 item.lParam = (LPARAM)pDescriptor;
 
                 iItem = ListView_InsertItem(hwndLV, &item);
                 if (iItem != -1)
                 {
-                    wsprintf(buffer, _T("0x%lx"), pDescriptor->u.Port.Length);
+                    wsprintf(buffer, L"0x%lx", pDescriptor->u.Port.Length);
                     ListView_SetItemText(hwndLV, iItem, 1, buffer);
 
                     if (pDescriptor->Flags & CM_RESOURCE_PORT_IO)
-                        LoadString(hInst, IDS_PORT_PORT_IO, buffer, sizeof(buffer)/sizeof(TCHAR));
+                        LoadStringW(hInst, IDS_PORT_PORT_IO, buffer, ARRAY_SIZE(buffer));
                     else
-                        LoadString(hInst, IDS_PORT_MEMORY_IO, buffer, sizeof(buffer)/sizeof(TCHAR));
+                        LoadStringW(hInst, IDS_PORT_MEMORY_IO, buffer, ARRAY_SIZE(buffer));
                     ListView_SetItemText(hwndLV, iItem, 2, buffer);
                 }
                 break;
@@ -725,7 +849,7 @@ ParseResources(HWND hwnd)
             case CmResourceTypeInterrupt:
                 hwndLV = GetDlgItem(hwnd, IDC_IRQ_LIST);
 
-                wsprintf(buffer, _T("%lu"), pDescriptor->u.Interrupt.Vector);
+                wsprintf(buffer, L"%lu", pDescriptor->u.Interrupt.Vector);
 
                 item.mask = LVIF_TEXT | LVIF_PARAM;
                 item.iItem = 1000;
@@ -733,22 +857,22 @@ ParseResources(HWND hwnd)
                 item.state = 0;
                 item.stateMask = 0;
                 item.pszText = buffer;
-                item.cchTextMax = (int)_tcslen(item.pszText);
+                item.cchTextMax = (int)wcslen(item.pszText);
                 item.lParam = (LPARAM)pDescriptor;
 
                 iItem = ListView_InsertItem(hwndLV, &item);
                 if (iItem != -1)
                 {
-                    wsprintf(buffer, _T("%lu"), pDescriptor->u.Interrupt.Level);
+                    wsprintf(buffer, L"%lu", pDescriptor->u.Interrupt.Level);
                     ListView_SetItemText(hwndLV, iItem, 1, buffer);
 
-                    wsprintf(buffer, _T("0x%08lx"), pDescriptor->u.Interrupt.Affinity);
+                    wsprintf(buffer, L"0x%08lx", pDescriptor->u.Interrupt.Affinity);
                     ListView_SetItemText(hwndLV, iItem, 2, buffer);
 
                     if (pDescriptor->Flags & CM_RESOURCE_INTERRUPT_LATCHED)
-                        LoadString(hInst, IDS_INTERRUPT_EDGE_SENSITIVE, buffer, sizeof(buffer)/sizeof(TCHAR));
+                        LoadStringW(hInst, IDS_INTERRUPT_EDGE_SENSITIVE, buffer, ARRAY_SIZE(buffer));
                     else
-                        LoadString(hInst, IDS_INTERRUPT_LEVEL_SENSITIVE, buffer, sizeof(buffer)/sizeof(TCHAR));
+                        LoadStringW(hInst, IDS_INTERRUPT_LEVEL_SENSITIVE, buffer, ARRAY_SIZE(buffer));
 
                     ListView_SetItemText(hwndLV, iItem, 3, buffer);
                 }
@@ -758,9 +882,9 @@ ParseResources(HWND hwnd)
                 hwndLV = GetDlgItem(hwnd, IDC_MEMORY_LIST);
 
 #ifdef _M_AMD64
-                wsprintf(buffer, _T("0x%16I64x"), pDescriptor->u.Memory.Start.QuadPart);
+                wsprintf(buffer, L"0x%016I64x", pDescriptor->u.Memory.Start.QuadPart);
 #else
-                wsprintf(buffer, _T("0x%08lx"), pDescriptor->u.Memory.Start.u.LowPart);
+                wsprintf(buffer, L"0x%08lx", pDescriptor->u.Memory.Start.u.LowPart);
 #endif
 
                 item.mask = LVIF_TEXT | LVIF_PARAM;
@@ -769,27 +893,27 @@ ParseResources(HWND hwnd)
                 item.state = 0;
                 item.stateMask = 0;
                 item.pszText = buffer;
-                item.cchTextMax = (int)_tcslen(item.pszText);
+                item.cchTextMax = (int)wcslen(item.pszText);
                 item.lParam = (LPARAM)pDescriptor;
 
                 iItem = ListView_InsertItem(hwndLV, &item);
                 if (iItem != -1)
                 {
-                    wsprintf(buffer, _T("0x%lx"), pDescriptor->u.Memory.Length);
+                    wsprintf(buffer, L"0x%lx", pDescriptor->u.Memory.Length);
                     ListView_SetItemText(hwndLV, iItem, 1, buffer);
 
                     switch (pDescriptor->Flags & (CM_RESOURCE_MEMORY_READ_ONLY | CM_RESOURCE_MEMORY_WRITE_ONLY))
                     {
                         case CM_RESOURCE_MEMORY_READ_ONLY:
-                            LoadString(hInst, IDS_MEMORY_READ_ONLY, buffer, sizeof(buffer)/sizeof(TCHAR));
+                            LoadStringW(hInst, IDS_MEMORY_READ_ONLY, buffer, ARRAY_SIZE(buffer));
                             break;
 
                         case CM_RESOURCE_MEMORY_WRITE_ONLY:
-                            LoadString(hInst, IDS_MEMORY_WRITE_ONLY, buffer, sizeof(buffer)/sizeof(TCHAR));
+                            LoadStringW(hInst, IDS_MEMORY_WRITE_ONLY, buffer, ARRAY_SIZE(buffer));
                             break;
 
                         default:
-                            LoadString(hInst, IDS_MEMORY_READ_WRITE, buffer, sizeof(buffer)/sizeof(TCHAR));
+                            LoadStringW(hInst, IDS_MEMORY_READ_WRITE, buffer, ARRAY_SIZE(buffer));
                             break;
                     }
 
@@ -800,7 +924,7 @@ ParseResources(HWND hwnd)
             case CmResourceTypeDma:
                 hwndLV = GetDlgItem(hwnd, IDC_DMA_LIST);
 
-                wsprintf(buffer, _T("%lu"), pDescriptor->u.Dma.Channel);
+                wsprintf(buffer, L"%lu", pDescriptor->u.Dma.Channel);
 
                 item.mask = LVIF_TEXT | LVIF_PARAM;
                 item.iItem = 1000;
@@ -808,13 +932,13 @@ ParseResources(HWND hwnd)
                 item.state = 0;
                 item.stateMask = 0;
                 item.pszText = buffer;
-                item.cchTextMax = (int)_tcslen(item.pszText);
+                item.cchTextMax = (int)wcslen(item.pszText);
                 item.lParam = (LPARAM)pDescriptor;
 
                 iItem = ListView_InsertItem(hwndLV, &item);
                 if (iItem != -1)
                 {
-                    wsprintf(buffer, _T("%lu"), pDescriptor->u.Dma.Port);
+                    wsprintf(buffer, L"%lu", pDescriptor->u.Dma.Port);
                     ListView_SetItemText(hwndLV, iItem, 1, buffer);
                 }
                 break;
@@ -822,7 +946,7 @@ ParseResources(HWND hwnd)
             case CmResourceTypeDeviceSpecific:
                 hwndLV = GetDlgItem(hwnd, IDC_DEVICE_LIST);
 
-                wsprintf(buffer, _T("0x%08lx"), pDescriptor->u.DeviceSpecificData.Reserved1);
+                wsprintf(buffer, L"0x%08lx", pDescriptor->u.DeviceSpecificData.Reserved1);
 
                 item.mask = LVIF_TEXT | LVIF_PARAM;
                 item.iItem = 1000;
@@ -830,16 +954,16 @@ ParseResources(HWND hwnd)
                 item.state = 0;
                 item.stateMask = 0;
                 item.pszText = buffer;
-                item.cchTextMax = (int)_tcslen(item.pszText);
+                item.cchTextMax = (int)wcslen(item.pszText);
                 item.lParam = (LPARAM)pDescriptor;
 
                 iItem = ListView_InsertItem(hwndLV, &item);
                 if (iItem != -1)
                 {
-                    wsprintf(buffer, _T("0x%08lx"), pDescriptor->u.DeviceSpecificData.Reserved2);
+                    wsprintf(buffer, L"0x%08lx", pDescriptor->u.DeviceSpecificData.Reserved2);
                     ListView_SetItemText(hwndLV, iItem, 1, buffer);
 
-                    wsprintf(buffer, _T("0x%lx"), pDescriptor->u.DeviceSpecificData.DataSize);
+                    wsprintf(buffer, L"0x%lx", pDescriptor->u.DeviceSpecificData.DataSize);
                     ListView_SetItemText(hwndLV, iItem, 2, buffer);
                 }
                 break;
@@ -866,7 +990,7 @@ OnResourceNotify(HWND hwndDlg, NMHDR *phdr)
                     if (lpnmlv->iItem != -1)
                     {
                         PCM_PARTIAL_RESOURCE_DESCRIPTOR pDescriptor;
-                        LVITEM item;
+                        LVITEMW item;
 
                         item.mask = LVIF_PARAM;
                         item.iItem = lpnmlv->iItem;
@@ -935,9 +1059,9 @@ static INT_PTR CALLBACK modify_resource_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM
 
 static BOOL CreateResourceListColumns(HWND hWndListView)
 {
-    TCHAR szText[80];
+    WCHAR szText[80];
     RECT rc;
-    LV_COLUMN lvC;
+    LVCOLUMN lvC;
 
     ListView_SetExtendedListViewStyle(hWndListView, LVS_EX_FULLROWSELECT);
 
@@ -951,13 +1075,13 @@ static BOOL CreateResourceListColumns(HWND hWndListView)
     /* Load the column labels from the resource file. */
     lvC.iSubItem = 0;
     lvC.cx = (rc.right - rc.left) / 2;
-    LoadString(hInst, IDS_BUSNUMBER, szText, sizeof(szText)/sizeof(TCHAR));
+    LoadStringW(hInst, IDS_BUSNUMBER, szText, ARRAY_SIZE(szText));
     if (ListView_InsertColumn(hWndListView, 0, &lvC) == -1)
         return FALSE;
 
     lvC.iSubItem = 1;
     lvC.cx = (rc.right - rc.left) - lvC.cx;
-    LoadString(hInst, IDS_INTERFACE, szText, sizeof(szText)/sizeof(TCHAR));
+    LoadStringW(hInst, IDS_INTERFACE, szText, ARRAY_SIZE(szText));
     if (ListView_InsertColumn(hWndListView, 1, &lvC) == -1)
         return FALSE;
 
@@ -967,16 +1091,15 @@ static BOOL CreateResourceListColumns(HWND hWndListView)
 static VOID AddFullResourcesToList(HWND hwnd)
 {
     PCM_FULL_RESOURCE_DESCRIPTOR pFullDescriptor;
-    TCHAR buffer[80];
-    LVITEM item;
+    WCHAR buffer[80];
+    LVITEMW item;
     ULONG i;
     INT iItem;
 
+    pFullDescriptor = &resourceValueData->List[0];
     for (i = 0; i < resourceValueData->Count; i++)
     {
-        pFullDescriptor = &resourceValueData->List[i];
-
-        wsprintf(buffer, _T("%lu"), pFullDescriptor->BusNumber);
+        wsprintf(buffer, L"%lu", pFullDescriptor->BusNumber);
 
         item.mask = LVIF_TEXT;
         item.iItem = i;
@@ -984,7 +1107,7 @@ static VOID AddFullResourcesToList(HWND hwnd)
         item.state = 0;
         item.stateMask = 0;
         item.pszText = buffer;
-        item.cchTextMax = (int)_tcslen(item.pszText);
+        item.cchTextMax = (int)wcslen(item.pszText);
 
         iItem = ListView_InsertItem(hwnd, &item);
         if (iItem != -1)
@@ -992,6 +1115,8 @@ static VOID AddFullResourcesToList(HWND hwnd)
             GetInterfaceType(pFullDescriptor->InterfaceType, buffer, 80);
             ListView_SetItemText(hwnd, iItem, 1, buffer);
         }
+        pFullDescriptor = (PVOID)(pFullDescriptor->PartialResourceList.PartialDescriptors +
+                                  pFullDescriptor->PartialResourceList.Count);
     }
 }
 
@@ -1014,7 +1139,7 @@ OnResourceListNotify(HWND hwndDlg, NMHDR *phdr)
                     if (lpnmlv->iItem != -1)
                     {
                         fullResourceIndex = lpnmlv->iItem;
-                        DialogBox(0, MAKEINTRESOURCE(IDD_EDIT_RESOURCE), hwndDlg, modify_resource_dlgproc);
+                        DialogBoxW(0, MAKEINTRESOURCEW(IDD_EDIT_RESOURCE), hwndDlg, modify_resource_dlgproc);
                     }
                     break;
             }
@@ -1044,7 +1169,7 @@ static INT_PTR CALLBACK modify_resource_list_dlgproc(HWND hwndDlg, UINT uMsg, WP
         {
         case IDC_SHOW_RESOURCE:
             if (fullResourceIndex != -1)
-                DialogBox(0, MAKEINTRESOURCE(IDD_EDIT_RESOURCE), hwndDlg, modify_resource_dlgproc);
+                DialogBoxW(0, MAKEINTRESOURCEW(IDD_EDIT_RESOURCE), hwndDlg, modify_resource_dlgproc);
             break;
         case IDOK:
             EndDialog(hwndDlg, IDOK);
@@ -1057,8 +1182,478 @@ static INT_PTR CALLBACK modify_resource_list_dlgproc(HWND hwndDlg, UINT uMsg, WP
     return FALSE;
 }
 
+static BOOL
+CreateRequirementsListColumns(HWND hWndListView)
+{
+    WCHAR szText[80];
+    RECT rc;
+    LVCOLUMN lvC;
 
-BOOL ModifyValue(HWND hwnd, HKEY hKey, LPCTSTR valueName, BOOL EditBin)
+    ListView_SetExtendedListViewStyle(hWndListView, LVS_EX_FULLROWSELECT);
+
+    GetClientRect(hWndListView, &rc);
+
+    /* Create columns. */
+    lvC.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
+    lvC.pszText = szText;
+    lvC.fmt = LVCFMT_LEFT;
+
+    /* Load the column labels from the resource file. */
+    lvC.iSubItem = 0;
+    lvC.cx = (rc.right - rc.left) / 4;
+    LoadStringW(hInst, IDS_REQALTERNATIVELIST, szText, ARRAY_SIZE(szText));
+    if (ListView_InsertColumn(hWndListView, 0, &lvC) == -1)
+        return FALSE;
+
+    lvC.iSubItem = 1;
+    lvC.cx = (rc.right - rc.left) / 4;
+    LoadStringW(hInst, IDS_REQRESOURCELIST, szText, ARRAY_SIZE(szText));
+    if (ListView_InsertColumn(hWndListView, 1, &lvC) == -1)
+        return FALSE;
+
+    lvC.iSubItem = 2;
+    lvC.cx = (rc.right - rc.left) / 4;
+    LoadStringW(hInst, IDS_REQDESCRIPTOR, szText, ARRAY_SIZE(szText));
+    if (ListView_InsertColumn(hWndListView, 2, &lvC) == -1)
+        return FALSE;
+
+    lvC.iSubItem = 3;
+    lvC.cx = (rc.right - rc.left) - (3 * ((rc.right - rc.left) / 4));
+    LoadStringW(hInst, IDS_REQDEVICETYPE, szText, ARRAY_SIZE(szText));
+    if (ListView_InsertColumn(hWndListView, 3, &lvC) == -1)
+        return FALSE;
+
+    return TRUE;
+}
+
+static VOID
+GetResourceType(UCHAR ResourceType,
+                LPWSTR pBuffer,
+                DWORD dwLength)
+{
+    switch (ResourceType)
+    {
+        case CmResourceTypePort:
+            LoadStringW(hInst, IDS_TYPE_PORT, pBuffer, dwLength);
+            break;
+
+        case CmResourceTypeInterrupt:
+            LoadStringW(hInst, IDS_TYPE_INTERRUPT, pBuffer, dwLength);
+            break;
+
+        case CmResourceTypeMemory:
+            LoadStringW(hInst, IDS_TYPE_MEMORY, pBuffer, dwLength);
+            break;
+
+        case CmResourceTypeDma:
+            LoadStringW(hInst, IDS_TYPE_DMA, pBuffer, dwLength);
+            break;
+
+        default:
+            wsprintf(pBuffer, L"Unknown %u", ResourceType);
+            break;
+    }
+}
+
+static VOID
+GetShareDisposition(
+    UCHAR ShareDisposition,
+    LPWSTR pBuffer,
+    DWORD dwLength)
+{
+    switch (ShareDisposition)
+    {
+        case CmResourceShareUndetermined:
+            LoadStringW(hInst, IDS_SHARE_UNDETERMINED, pBuffer, dwLength);
+            break;
+
+        case CmResourceShareDeviceExclusive:
+            LoadStringW(hInst, IDS_SHARE_DEVICE_EXCLUSIVE, pBuffer, dwLength);
+            break;
+
+        case CmResourceShareDriverExclusive:
+            LoadStringW(hInst, IDS_SHARE_DRIVER_EXCLUSIVE, pBuffer, dwLength);
+            break;
+
+        case CmResourceShareShared:
+            LoadStringW(hInst, IDS_SHARE_SHARED, pBuffer, dwLength);
+            break;
+    }
+}
+
+static VOID
+GetPortType(
+    USHORT Flags,
+    LPWSTR pBuffer,
+    DWORD dwLength)
+{
+    if ((Flags & CM_RESOURCE_PORT_IO) == CM_RESOURCE_PORT_IO)
+    {
+        LoadStringW(hInst, IDS_PORT_PORT_IO, pBuffer, dwLength);
+    }
+    else if ((Flags & CM_RESOURCE_PORT_IO) == CM_RESOURCE_PORT_MEMORY)
+    {
+        LoadStringW(hInst, IDS_PORT_MEMORY_IO, pBuffer, dwLength);
+    }
+}
+
+static VOID
+GetMemoryAccess(
+    USHORT Flags,
+    LPWSTR pBuffer,
+    DWORD dwLength)
+{
+    if ((Flags & (CM_RESOURCE_MEMORY_READ_ONLY | CM_RESOURCE_MEMORY_WRITE_ONLY)) == CM_RESOURCE_MEMORY_READ_WRITE)
+    {
+        LoadStringW(hInst, IDS_MEMORY_READ_WRITE, pBuffer, dwLength);
+    }
+    else if ((Flags & (CM_RESOURCE_MEMORY_READ_ONLY | CM_RESOURCE_MEMORY_WRITE_ONLY)) == CM_RESOURCE_MEMORY_READ_ONLY)
+    {
+        LoadStringW(hInst, IDS_MEMORY_READ_ONLY, pBuffer, dwLength);
+    }
+    else if ((Flags & (CM_RESOURCE_MEMORY_READ_ONLY | CM_RESOURCE_MEMORY_WRITE_ONLY)) == CM_RESOURCE_MEMORY_WRITE_ONLY)
+    {
+        LoadStringW(hInst, IDS_MEMORY_WRITE_ONLY, pBuffer, dwLength);
+    }
+}
+
+static VOID
+GetInterruptType(
+    USHORT Flags,
+    LPWSTR pBuffer,
+    DWORD dwLength)
+{
+    if ((Flags & CM_RESOURCE_INTERRUPT_LEVEL_LATCHED_BITS) == CM_RESOURCE_INTERRUPT_LATCHED)
+    {
+        LoadStringW(hInst, IDS_INTERRUPT_EDGE_SENSITIVE, pBuffer, dwLength);
+    }
+    else
+    {
+        LoadStringW(hInst, IDS_INTERRUPT_LEVEL_SENSITIVE, pBuffer, dwLength);
+    }
+}
+
+static VOID
+AddRequirementsToList(HWND hwndDlg, HWND hwnd)
+{
+    PIO_RESOURCE_LIST pResourceList;
+    PIO_RESOURCE_DESCRIPTOR pDescriptor; 
+    WCHAR buffer[80];
+    LVITEMW item;
+    ULONG i, j, index;
+    INT iItem;
+
+    index = 0;
+    pResourceList = &requirementsValueData->List[0];
+    for (i = 0; i < requirementsValueData->AlternativeLists; i++)
+    {
+        for (j = 0; j < pResourceList->Count; j++)
+        {
+            pDescriptor = &pResourceList->Descriptors[j];
+
+            wsprintf(buffer, L"%lu", i + 1);
+
+            item.mask = LVIF_TEXT | LVIF_PARAM;
+            item.iItem = index;
+            item.iSubItem = 0;
+            item.state = 0;
+            item.stateMask = 0;
+            item.pszText = buffer;
+            item.cchTextMax = (int)wcslen(item.pszText);
+            item.lParam = (LPARAM)pDescriptor;
+
+            iItem = ListView_InsertItem(hwnd, &item);
+            if (iItem != -1)
+            {
+                wsprintf(buffer, L"%lu", j + 1);
+                ListView_SetItemText(hwnd, iItem, 1, buffer);
+                wsprintf(buffer, L"%lu", 1);
+                ListView_SetItemText(hwnd, iItem, 2, buffer);
+
+                GetResourceType(pDescriptor->Type, buffer, 80);
+                ListView_SetItemText(hwnd, iItem, 3, buffer);
+            }
+
+            index++;
+        }
+
+
+        pResourceList = (PIO_RESOURCE_LIST)(pResourceList->Descriptors + pResourceList->Count);
+    }
+
+    GetInterfaceType(requirementsValueData->InterfaceType, buffer, 80);
+    SetDlgItemTextW(hwndDlg, IDC_REQINTERFACETYPE, buffer);
+    SetDlgItemInt(hwndDlg, IDC_REQBUSNUMBER, (UINT)requirementsValueData->BusNumber, TRUE);
+    SetDlgItemInt(hwndDlg, IDC_REQSLOTNUMBER, (UINT)requirementsValueData->SlotNumber, FALSE);
+}
+
+static INT_PTR CALLBACK show_requirements_port_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+    PIO_RESOURCE_DESCRIPTOR pDescriptor;
+    WCHAR Buffer[80];
+
+    switch(uMsg)
+    {
+    case WM_INITDIALOG:
+        pDescriptor = (PIO_RESOURCE_DESCRIPTOR)lParam;
+
+        GetPortType(pDescriptor->Flags, Buffer, 80);
+        SetDlgItemTextW(hwndDlg, IDC_REQ_PORT_TYPE, Buffer);
+
+        wsprintf(Buffer, L"0x%lx", pDescriptor->u.Port.Length);
+        SetDlgItemTextW(hwndDlg, IDC_REQ_PORT_LENGTH, Buffer);
+        wsprintf(Buffer, L"0x%lx", pDescriptor->u.Port.Alignment);
+        SetDlgItemTextW(hwndDlg, IDC_REQ_PORT_ALIGN, Buffer);
+#ifdef _M_AMD64
+        wsprintf(Buffer, L"0x%016I64x", pDescriptor->u.Port.MinimumAddress.QuadPart);
+#else
+        wsprintf(Buffer, L"0x%08lx", pDescriptor->u.Port.MinimumAddress.u.LowPart);
+#endif
+        SetDlgItemTextW(hwndDlg, IDC_REQ_PORT_MIN, Buffer);
+#ifdef _M_AMD64
+        wsprintf(Buffer, L"0x%016I64x", pDescriptor->u.Port.MaximumAddress.QuadPart);
+#else
+        wsprintf(Buffer, L"0x%08lx", pDescriptor->u.Port.MaximumAddress.u.LowPart);
+#endif
+        SetDlgItemTextW(hwndDlg, IDC_REQ_PORT_MAX, Buffer);
+
+        GetShareDisposition(pDescriptor->ShareDisposition, Buffer, 80);
+        SetDlgItemTextW(hwndDlg, IDC_REQ_PORT_SHARE, Buffer);
+
+        EnableWindow(GetDlgItem(hwndDlg, IDC_REQ_PORT_ALTERNATIVE), (pDescriptor->Option & IO_RESOURCE_ALTERNATIVE));
+        EnableWindow(GetDlgItem(hwndDlg, IDC_REQ_PORT_PREFERRED), (pDescriptor->Option & IO_RESOURCE_PREFERRED));
+        return FALSE;
+
+    case WM_COMMAND:
+        switch (LOWORD(wParam))
+        {
+        case IDOK:
+        case IDCANCEL:
+            EndDialog(hwndDlg, IDOK);
+            break;
+        }
+    }
+    return FALSE;
+}
+
+static INT_PTR CALLBACK show_requirements_memory_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+    PIO_RESOURCE_DESCRIPTOR pDescriptor;
+    WCHAR Buffer[80];
+
+    switch(uMsg)
+    {
+    case WM_INITDIALOG:
+        pDescriptor = (PIO_RESOURCE_DESCRIPTOR)lParam;
+
+        GetMemoryAccess(pDescriptor->Flags, Buffer, 80);
+        SetDlgItemTextW(hwndDlg, IDC_REQ_MEMORY_ACCESS, Buffer);
+
+        wsprintf(Buffer, L"0x%lx", pDescriptor->u.Memory.Length);
+        SetDlgItemTextW(hwndDlg, IDC_REQ_MEMORY_LENGTH, Buffer);
+        wsprintf(Buffer, L"0x%lx", pDescriptor->u.Memory.Alignment);
+        SetDlgItemTextW(hwndDlg, IDC_REQ_MEMORY_ALIGN, Buffer);
+#ifdef _M_AMD64
+        wsprintf(Buffer, L"0x%016I64x", pDescriptor->u.Memory.MinimumAddress.QuadPart);
+#else
+        wsprintf(Buffer, L"0x%08lx", pDescriptor->u.Memory.MinimumAddress.u.LowPart);
+#endif
+        SetDlgItemTextW(hwndDlg, IDC_REQ_MEMORY_MIN, Buffer);
+#ifdef _M_AMD64
+        wsprintf(Buffer, L"0x%016I64x", pDescriptor->u.Memory.MaximumAddress.QuadPart);
+#else
+        wsprintf(Buffer, L"0x%08lx", pDescriptor->u.Memory.MaximumAddress.u.LowPart);
+#endif
+        SetDlgItemTextW(hwndDlg, IDC_REQ_MEMORY_MAX, Buffer);
+
+        GetShareDisposition(pDescriptor->ShareDisposition, Buffer, 80);
+        SetDlgItemTextW(hwndDlg, IDC_REQ_MEMORY_SHARE, Buffer);
+
+        EnableWindow(GetDlgItem(hwndDlg, IDC_REQ_MEMORY_ALTERNATIVE), (pDescriptor->Option & IO_RESOURCE_ALTERNATIVE));
+        EnableWindow(GetDlgItem(hwndDlg, IDC_REQ_MEMORY_PREFERRED), (pDescriptor->Option & IO_RESOURCE_PREFERRED));
+        return FALSE;
+
+    case WM_COMMAND:
+        switch (LOWORD(wParam))
+        {
+        case IDOK:
+        case IDCANCEL:
+            EndDialog(hwndDlg, IDOK);
+            break;
+        }
+    }
+    return FALSE;
+}
+
+static INT_PTR CALLBACK show_requirements_interrupt_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+    PIO_RESOURCE_DESCRIPTOR pDescriptor;
+    WCHAR Buffer[80];
+
+    switch(uMsg)
+    {
+    case WM_INITDIALOG:
+        pDescriptor = (PIO_RESOURCE_DESCRIPTOR)lParam;
+
+        GetInterruptType(pDescriptor->Flags, Buffer, 80);
+        SetDlgItemTextW(hwndDlg, IDC_REQ_INT_TYPE, Buffer);
+
+        wsprintf(Buffer, L"0x%lx", pDescriptor->u.Interrupt.MinimumVector);
+        SetDlgItemTextW(hwndDlg, IDC_REQ_INT_MIN, Buffer);
+        wsprintf(Buffer, L"0x%lx", pDescriptor->u.Interrupt.MaximumVector);
+        SetDlgItemTextW(hwndDlg, IDC_REQ_INT_MAX, Buffer);
+
+        GetShareDisposition(pDescriptor->ShareDisposition, Buffer, 80);
+        SetDlgItemTextW(hwndDlg, IDC_REQ_INT_SHARE, Buffer);
+
+        EnableWindow(GetDlgItem(hwndDlg, IDC_REQ_INT_ALTERNATIVE), (pDescriptor->Option & IO_RESOURCE_ALTERNATIVE));
+        EnableWindow(GetDlgItem(hwndDlg, IDC_REQ_INT_PREFERRED), (pDescriptor->Option & IO_RESOURCE_PREFERRED));
+        return FALSE;
+
+    case WM_COMMAND:
+        switch (LOWORD(wParam))
+        {
+        case IDOK:
+        case IDCANCEL:
+            EndDialog(hwndDlg, IDOK);
+            break;
+        }
+    }
+    return FALSE;
+}
+
+static INT_PTR CALLBACK show_requirements_dma_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+    PIO_RESOURCE_DESCRIPTOR pDescriptor;
+    WCHAR Buffer[80];
+
+    switch(uMsg)
+    {
+    case WM_INITDIALOG:
+        pDescriptor = (PIO_RESOURCE_DESCRIPTOR)lParam;
+        wsprintf(Buffer, L"0x%lx", pDescriptor->u.Dma.MinimumChannel);
+        SetDlgItemTextW(hwndDlg, IDC_REQ_DMA_MIN, Buffer);
+        wsprintf(Buffer, L"0x%lx", pDescriptor->u.Dma.MaximumChannel);
+        SetDlgItemTextW(hwndDlg, IDC_REQ_DMA_MAX, Buffer);
+
+        GetShareDisposition(pDescriptor->ShareDisposition, Buffer, 80);
+        SetDlgItemTextW(hwndDlg, IDC_REQ_DMA_SHARE, Buffer);
+
+        EnableWindow(GetDlgItem(hwndDlg, IDC_REQ_DMA_ALTERNATIVE), (pDescriptor->Option & IO_RESOURCE_ALTERNATIVE));
+        EnableWindow(GetDlgItem(hwndDlg, IDC_REQ_DMA_PREFERRED), (pDescriptor->Option & IO_RESOURCE_PREFERRED));
+        return FALSE;
+
+    case WM_COMMAND:
+        switch (LOWORD(wParam))
+        {
+        case IDOK:
+        case IDCANCEL:
+           EndDialog(hwndDlg, IDOK);
+            break;
+        }
+    }
+    return FALSE;
+}
+
+static VOID
+ShowRequirement(HWND hwndDlg)
+{
+    PIO_RESOURCE_DESCRIPTOR pDescriptor; 
+    LVITEMW item;
+
+    if (requirementsIndex == -1)
+        return;
+
+    item.mask = LVIF_PARAM;
+    item.iItem = requirementsIndex;
+    item.iSubItem = 0;
+    ListView_GetItem(GetDlgItem(hwndDlg, IDC_REQUIREMENTS_LIST), &item);
+
+    pDescriptor = (PIO_RESOURCE_DESCRIPTOR)item.lParam; 
+    if (pDescriptor)
+    {
+        switch (pDescriptor->Type)
+        {
+        case CmResourceTypePort:
+            DialogBoxParamW(0, MAKEINTRESOURCEW(IDD_EDIT_REQUIREMENTS_PORT), hwndDlg, show_requirements_port_dlgproc, (LPARAM)pDescriptor);
+            break;
+        case CmResourceTypeMemory:
+            DialogBoxParamW(0, MAKEINTRESOURCEW(IDD_EDIT_REQUIREMENTS_MEMORY), hwndDlg, show_requirements_memory_dlgproc, (LPARAM)pDescriptor);
+            break;
+        case CmResourceTypeInterrupt:
+            DialogBoxParamW(0, MAKEINTRESOURCEW(IDD_EDIT_REQUIREMENTS_INT), hwndDlg, show_requirements_interrupt_dlgproc, (LPARAM)pDescriptor);
+            break;
+        case CmResourceTypeDma:
+            DialogBoxParamW(0, MAKEINTRESOURCEW(IDD_EDIT_REQUIREMENTS_DMA), hwndDlg, show_requirements_dma_dlgproc, (LPARAM)pDescriptor);
+            break;
+        default:
+            break;
+        }
+    }
+}
+
+static BOOL
+OnRequirementsListNotify(HWND hwndDlg, NMHDR *phdr)
+{
+    LPNMLISTVIEW lpnmlv = (LPNMLISTVIEW)phdr;
+
+    switch (phdr->idFrom)
+    {
+        case IDC_REQUIREMENTS_LIST:
+            switch(phdr->code)
+            {
+                case NM_CLICK:
+                    requirementsIndex = lpnmlv->iItem;
+                    EnableWindow(GetDlgItem(hwndDlg, IDC_SHOW_REQUIREMENT), (lpnmlv->iItem != -1));
+                    break;
+
+                case NM_DBLCLK:
+                    if (lpnmlv->iItem != -1)
+                    {
+                        requirementsIndex = lpnmlv->iItem;
+                        ShowRequirement(hwndDlg);
+                    }
+                    break;
+            }
+            break;
+    }
+
+    return FALSE;
+}
+
+static INT_PTR CALLBACK modify_requirements_list_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+    UNREFERENCED_PARAMETER(lParam);
+
+    switch(uMsg)
+    {
+    case WM_INITDIALOG:
+        CreateRequirementsListColumns(GetDlgItem(hwndDlg, IDC_REQUIREMENTS_LIST));
+        AddRequirementsToList(hwndDlg, GetDlgItem(hwndDlg, IDC_REQUIREMENTS_LIST));
+        return FALSE;
+
+    case WM_NOTIFY:
+        return OnRequirementsListNotify(hwndDlg, (NMHDR *)lParam);
+
+    case WM_COMMAND:
+        switch (LOWORD(wParam))
+        {
+        case IDC_SHOW_REQUIREMENT:
+            if (requirementsIndex != -1)
+                ShowRequirement(hwndDlg);
+            break;
+        case IDOK:
+            EndDialog(hwndDlg, IDOK);
+            break;
+        case IDCANCEL:
+            EndDialog(hwndDlg, IDCANCEL);
+            return TRUE;
+        }
+    }
+    return FALSE;
+}
+
+BOOL ModifyValue(HWND hwnd, HKEY hKey, LPCWSTR valueName, BOOL EditBin)
 {
     DWORD type;
     LONG lRet;
@@ -1069,8 +1664,8 @@ BOOL ModifyValue(HWND hwnd, HKEY hKey, LPCTSTR valueName, BOOL EditBin)
 
     editValueName = valueName;
 
-    lRet = RegQueryValueEx(hKey, valueName, 0, &type, 0, &valueDataLen);
-    if (lRet != ERROR_SUCCESS && (!_tcscmp(valueName, _T("")) || valueName == NULL))
+    lRet = RegQueryValueExW(hKey, valueName, 0, &type, 0, &valueDataLen);
+    if (lRet != ERROR_SUCCESS && (valueName == NULL || !valueName[0]))
     {
         lRet = ERROR_SUCCESS; /* Allow editing of (Default) values which don't exist */
         type = REG_SZ;
@@ -1094,7 +1689,7 @@ BOOL ModifyValue(HWND hwnd, HKEY hKey, LPCTSTR valueName, BOOL EditBin)
                 error(hwnd, IDS_TOO_BIG_VALUE, valueDataLen);
                 goto done;
             }
-            lRet = RegQueryValueEx(hKey, valueName, 0, 0, (LPBYTE)stringValueData, &valueDataLen);
+            lRet = RegQueryValueExW(hKey, valueName, 0, 0, (LPBYTE)stringValueData, &valueDataLen);
             if (lRet != ERROR_SUCCESS)
             {
                 error(hwnd, IDS_BAD_VALUE, valueName);
@@ -1106,15 +1701,15 @@ BOOL ModifyValue(HWND hwnd, HKEY hKey, LPCTSTR valueName, BOOL EditBin)
             stringValueData = NULL;
         }
 
-        if (DialogBox(0, MAKEINTRESOURCE(IDD_EDIT_STRING), hwnd, modify_string_dlgproc) == IDOK)
+        if (DialogBoxW(0, MAKEINTRESOURCEW(IDD_EDIT_STRING), hwnd, modify_string_dlgproc) == IDOK)
         {
             if (stringValueData)
             {
-                lRet = RegSetValueEx(hKey, valueName, 0, type, (LPBYTE)stringValueData, (DWORD) (_tcslen(stringValueData) + 1) * sizeof(TCHAR));
+                lRet = RegSetValueExW(hKey, valueName, 0, type, (LPBYTE)stringValueData, (DWORD) (wcslen(stringValueData) + 1) * sizeof(WCHAR));
             }
             else
             {
-                lRet = RegSetValueEx(hKey, valueName, 0, type, NULL, 0);
+                lRet = RegSetValueExW(hKey, valueName, 0, type, NULL, 0);
             }
             if (lRet == ERROR_SUCCESS)
                 result = TRUE;
@@ -1125,14 +1720,14 @@ BOOL ModifyValue(HWND hwnd, HKEY hKey, LPCTSTR valueName, BOOL EditBin)
         if (valueDataLen > 0)
         {
             size_t llen, listlen, nl_len;
-            LPTSTR src, lines = NULL;
+            LPWSTR src, lines = NULL;
 
-            if (!(stringValueData = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, valueDataLen + sizeof(TCHAR))))
+            if (!(stringValueData = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, valueDataLen + sizeof(WCHAR))))
             {
                 error(hwnd, IDS_TOO_BIG_VALUE, valueDataLen);
                 goto done;
             }
-            lRet = RegQueryValueEx(hKey, valueName, 0, 0, (LPBYTE)stringValueData, &valueDataLen);
+            lRet = RegQueryValueExW(hKey, valueName, 0, 0, (LPBYTE)stringValueData, &valueDataLen);
             if (lRet != ERROR_SUCCESS)
             {
                 error(hwnd, IDS_BAD_VALUE, valueName);
@@ -1141,18 +1736,18 @@ BOOL ModifyValue(HWND hwnd, HKEY hKey, LPCTSTR valueName, BOOL EditBin)
 
             /* convert \0 to \r\n */
             src = stringValueData;
-            nl_len = _tcslen(_T("\r\n")) * sizeof(TCHAR);
-            listlen = sizeof(TCHAR);
-            lines = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, listlen + sizeof(TCHAR));
-            while(*src != _T('\0'))
+            nl_len = wcslen(L"\r\n") * sizeof(WCHAR);
+            listlen = sizeof(WCHAR);
+            lines = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, listlen + sizeof(WCHAR));
+            while(*src != L'\0')
             {
-                llen = _tcslen(src);
+                llen = wcslen(src);
                 if(llen == 0)
                     break;
-                listlen += (llen * sizeof(TCHAR)) + nl_len;
+                listlen += (llen * sizeof(WCHAR)) + nl_len;
                 lines = HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, lines, listlen);
-                _tcscat(lines, src);
-                _tcscat(lines, _T("\r\n"));
+                wcscat(lines, src);
+                wcscat(lines, L"\r\n");
                 src += llen + 1;
             }
             HeapFree(GetProcessHeap(), 0, stringValueData);
@@ -1163,23 +1758,23 @@ BOOL ModifyValue(HWND hwnd, HKEY hKey, LPCTSTR valueName, BOOL EditBin)
             stringValueData = NULL;
         }
 
-        if (DialogBox(0, MAKEINTRESOURCE(IDD_EDIT_MULTI_STRING), hwnd, modify_multi_string_dlgproc) == IDOK)
+        if (DialogBoxW(0, MAKEINTRESOURCEW(IDD_EDIT_MULTI_STRING), hwnd, modify_multi_string_dlgproc) == IDOK)
         {
             if (stringValueData)
             {
                 /* convert \r\n to \0 */
                 BOOL EmptyLines = FALSE;
-                LPTSTR src, lines, nl;
+                LPWSTR src, lines, nl;
                 size_t linechars, buflen, c_nl, dest;
 
                 src = stringValueData;
-                buflen = sizeof(TCHAR);
-                lines = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, buflen + sizeof(TCHAR));
-                c_nl = _tcslen(_T("\r\n"));
+                buflen = sizeof(WCHAR);
+                lines = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, buflen + sizeof(WCHAR));
+                c_nl = wcslen(L"\r\n");
                 dest = 0;
-                while(*src != _T('\0'))
+                while(*src != L'\0')
                 {
-                    if((nl = _tcsstr(src, _T("\r\n"))))
+                    if((nl = wcsstr(src, L"\r\n")))
                     {
                         linechars = nl - src;
                         if(nl == src)
@@ -1191,15 +1786,15 @@ BOOL ModifyValue(HWND hwnd, HKEY hKey, LPCTSTR valueName, BOOL EditBin)
                     }
                     else
                     {
-                        linechars = _tcslen(src);
+                        linechars = wcslen(src);
                     }
                     if(linechars > 0)
                     {
-                        buflen += ((linechars + 1) * sizeof(TCHAR));
+                        buflen += ((linechars + 1) * sizeof(WCHAR));
                         lines = HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, lines, buflen);
-                        memcpy((lines + dest), src, linechars * sizeof(TCHAR));
+                        memcpy((lines + dest), src, linechars * sizeof(WCHAR));
                         dest += linechars;
-                        lines[dest++] = _T('\0');
+                        lines[dest++] = L'\0';
                     }
                     else
                     {
@@ -1207,19 +1802,19 @@ BOOL ModifyValue(HWND hwnd, HKEY hKey, LPCTSTR valueName, BOOL EditBin)
                     }
                     src += linechars + (nl != NULL ? c_nl : 0);
                 }
-                lines[++dest] = _T('\0');
+                lines[++dest] = L'\0';
 
                 if(EmptyLines)
                 {
                     warning(hwnd, IDS_MULTI_SZ_EMPTY_STRING);
                 }
 
-                lRet = RegSetValueEx(hKey, valueName, 0, type, (LPBYTE)lines, (DWORD) buflen);
+                lRet = RegSetValueExW(hKey, valueName, 0, type, (LPBYTE)lines, (DWORD) buflen);
                 HeapFree(GetProcessHeap(), 0, lines);
             }
             else
             {
-                lRet = RegSetValueEx(hKey, valueName, 0, type, NULL, 0);
+                lRet = RegSetValueExW(hKey, valueName, 0, type, NULL, 0);
             }
             if (lRet == ERROR_SUCCESS)
                 result = TRUE;
@@ -1227,16 +1822,16 @@ BOOL ModifyValue(HWND hwnd, HKEY hKey, LPCTSTR valueName, BOOL EditBin)
     }
     else if (EditBin == FALSE && type == REG_DWORD)
     {
-        lRet = RegQueryValueEx(hKey, valueName, 0, 0, (LPBYTE)&dwordValueData, &valueDataLen);
+        lRet = RegQueryValueExW(hKey, valueName, 0, 0, (LPBYTE)&dwordValueData, &valueDataLen);
         if (lRet != ERROR_SUCCESS)
         {
             error(hwnd, IDS_BAD_VALUE, valueName);
             goto done;
         }
 
-        if (DialogBox(0, MAKEINTRESOURCE(IDD_EDIT_DWORD), hwnd, modify_dword_dlgproc) == IDOK)
+        if (DialogBoxW(0, MAKEINTRESOURCEW(IDD_EDIT_DWORD), hwnd, modify_dword_dlgproc) == IDOK)
         {
-            lRet = RegSetValueEx(hKey, valueName, 0, type, (LPBYTE)&dwordValueData, sizeof(DWORD));
+            lRet = RegSetValueExW(hKey, valueName, 0, type, (LPBYTE)&dwordValueData, sizeof(DWORD));
             if (lRet == ERROR_SUCCESS)
                 result = TRUE;
         }
@@ -1252,7 +1847,7 @@ BOOL ModifyValue(HWND hwnd, HKEY hKey, LPCTSTR valueName, BOOL EditBin)
                 goto done;
             }
 
-            lRet = RegQueryValueEx(hKey, valueName, 0, 0, (LPBYTE)resourceValueData, &valueDataLen);
+            lRet = RegQueryValueExW(hKey, valueName, 0, 0, (LPBYTE)resourceValueData, &valueDataLen);
             if (lRet != ERROR_SUCCESS)
             {
                 error(hwnd, IDS_BAD_VALUE, valueName);
@@ -1264,30 +1859,70 @@ BOOL ModifyValue(HWND hwnd, HKEY hKey, LPCTSTR valueName, BOOL EditBin)
             resourceValueData = NULL;
         }
 
-        if (DialogBox(0, MAKEINTRESOURCE(IDD_EDIT_RESOURCE_LIST), hwnd, modify_resource_list_dlgproc) == IDOK)
+        if (DialogBoxW(0, MAKEINTRESOURCEW(IDD_EDIT_RESOURCE_LIST), hwnd, modify_resource_list_dlgproc) == IDOK)
         {
         }
     }
-    else if (EditBin == TRUE || type == REG_NONE || type == REG_BINARY)
+    else if (EditBin == FALSE && type == REG_FULL_RESOURCE_DESCRIPTOR)
     {
-#ifndef UNICODE
-        LPWSTR u_valuename;
-        int len_vname = lstrlen(valueName);
+        if (valueDataLen > 0)
+        {
+            resourceValueData = HeapAlloc(GetProcessHeap(), 0, valueDataLen + sizeof(ULONG));
+            if (resourceValueData == NULL)
+            {
+                error(hwnd, IDS_TOO_BIG_VALUE, valueDataLen);
+                goto done;
+            }
+
+            lRet = RegQueryValueExW(hKey, valueName, 0, 0, (LPBYTE)&resourceValueData->List[0], &valueDataLen);
+            if (lRet != ERROR_SUCCESS)
+            {
+                error(hwnd, IDS_BAD_VALUE, valueName);
+                goto done;
+            }
+
+            resourceValueData->Count = 1;
+            fullResourceIndex = 0;
+        }
+        else
+        {
+            resourceValueData = NULL;
+        }
 
-        if(len_vname > 0)
+        if (DialogBoxW(0, MAKEINTRESOURCEW(IDD_EDIT_RESOURCE), hwnd, modify_resource_dlgproc) == IDOK)
         {
-            if(!(u_valuename = HeapAlloc(GetProcessHeap(), 0, (len_vname + 1) * sizeof(WCHAR))))
+        }
+    }
+    else if (EditBin == FALSE && type == REG_RESOURCE_REQUIREMENTS_LIST)
+    {
+        if (valueDataLen > 0)
+        {
+            requirementsValueData = HeapAlloc(GetProcessHeap(), 0, valueDataLen + sizeof(ULONG));
+            if (requirementsValueData == NULL)
+            {
+                error(hwnd, IDS_TOO_BIG_VALUE, valueDataLen);
+                goto done;
+            }
+
+            lRet = RegQueryValueExW(hKey, valueName, 0, 0, (LPBYTE)requirementsValueData, &valueDataLen);
+            if (lRet != ERROR_SUCCESS)
             {
-                error(hwnd, IDS_TOO_BIG_VALUE, len_vname);
+                error(hwnd, IDS_BAD_VALUE, valueName);
                 goto done;
             }
-            /* convert the ansi value name to an unicode string */
-            MultiByteToWideChar(CP_ACP, 0, valueName, -1, u_valuename, len_vname + 1);
-            valueDataLen *= sizeof(WCHAR);
+
         }
         else
-            u_valuename = L"";
-#endif
+        {
+            requirementsValueData = NULL;
+        }
+
+        if (DialogBoxW(0, MAKEINTRESOURCEW(IDD_EDIT_REQUIREMENTS_LIST), hwnd, modify_requirements_list_dlgproc) == IDOK)
+        {
+        }
+    }
+    else if ((EditBin != FALSE) || (type == REG_NONE) || (type == REG_BINARY))
+    {
         if(valueDataLen > 0)
         {
             if(!(binValueData = HeapAlloc(GetProcessHeap(), 0, valueDataLen + 1)))
@@ -1296,21 +1931,12 @@ BOOL ModifyValue(HWND hwnd, HKEY hKey, LPCTSTR valueName, BOOL EditBin)
                 goto done;
             }
 
-            /* force to use the unicode version, so editing strings in binary mode is correct */
-            lRet = RegQueryValueExW(hKey,
-#ifndef UNICODE
-                                    u_valuename,
-#else
-                                    valueName,
-#endif
+            /* Use the unicode version, so editing strings in binary mode is correct */
+            lRet = RegQueryValueExW(hKey, valueName,
                                     0, 0, (LPBYTE)binValueData, &valueDataLen);
             if (lRet != ERROR_SUCCESS)
             {
                 HeapFree(GetProcessHeap(), 0, binValueData);
-#ifndef UNICODE
-                if(len_vname > 0)
-                    HeapFree(GetProcessHeap(), 0, u_valuename);
-#endif
                 error(hwnd, IDS_BAD_VALUE, valueName);
                 goto done;
             }
@@ -1320,25 +1946,16 @@ BOOL ModifyValue(HWND hwnd, HKEY hKey, LPCTSTR valueName, BOOL EditBin)
             binValueData = NULL;
         }
 
-        if (DialogBox(0, MAKEINTRESOURCE(IDD_EDIT_BIN_DATA), hwnd, modify_binary_dlgproc) == IDOK)
+        if (DialogBoxW(0, MAKEINTRESOURCEW(IDD_EDIT_BIN_DATA), hwnd, modify_binary_dlgproc) == IDOK)
         {
-            /* force to use the unicode version, so editing strings in binary mode is correct */
-            lRet = RegSetValueExW(hKey,
-#ifndef UNICODE
-                                  u_valuename,
-#else
-                                  valueName,
-#endif
+            /* Use the unicode version, so editing strings in binary mode is correct */
+            lRet = RegSetValueExW(hKey, valueName,
                                   0, type, (LPBYTE)binValueData, valueDataLen);
             if (lRet == ERROR_SUCCESS)
                 result = TRUE;
         }
         if(binValueData != NULL)
             HeapFree(GetProcessHeap(), 0, binValueData);
-#ifndef UNICODE
-        if(len_vname > 0)
-            HeapFree(GetProcessHeap(), 0, u_valuename);
-#endif
     }
     else
     {
@@ -1354,18 +1971,22 @@ done:
         HeapFree(GetProcessHeap(), 0, stringValueData);
     stringValueData = NULL;
 
+    if (requirementsValueData)
+        HeapFree(GetProcessHeap(), 0, requirementsValueData);
+    requirementsValueData = NULL;
+
     return result;
 }
 
-static LONG CopyKey(HKEY hDestKey, LPCTSTR lpDestSubKey, HKEY hSrcKey, LPCTSTR lpSrcSubKey)
+static LONG CopyKey(HKEY hDestKey, LPCWSTR lpDestSubKey, HKEY hSrcKey, LPCWSTR lpSrcSubKey)
 {
     LONG lResult;
     DWORD dwDisposition;
     HKEY hDestSubKey = NULL;
     HKEY hSrcSubKey = NULL;
     DWORD dwIndex, dwType, cbName, cbData;
-    TCHAR szSubKey[256];
-    TCHAR szValueName[256];
+    WCHAR szSubKey[256];
+    WCHAR szValueName[256];
     BYTE szValueData[512];
 
     FILETIME ft;
@@ -1373,14 +1994,14 @@ static LONG CopyKey(HKEY hDestKey, LPCTSTR lpDestSubKey, HKEY hSrcKey, LPCTSTR l
     /* open the source subkey, if specified */
     if (lpSrcSubKey)
     {
-        lResult = RegOpenKeyEx(hSrcKey, lpSrcSubKey, 0, KEY_ALL_ACCESS, &hSrcSubKey);
+        lResult = RegOpenKeyExW(hSrcKey, lpSrcSubKey, 0, KEY_ALL_ACCESS, &hSrcSubKey);
         if (lResult)
             goto done;
         hSrcKey = hSrcSubKey;
     }
 
     /* create the destination subkey */
-    lResult = RegCreateKeyEx(hDestKey, lpDestSubKey, 0, NULL, 0, KEY_WRITE, NULL,
+    lResult = RegCreateKeyExW(hDestKey, lpDestSubKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL,
                              &hDestSubKey, &dwDisposition);
     if (lResult)
         goto done;
@@ -1390,7 +2011,7 @@ static LONG CopyKey(HKEY hDestKey, LPCTSTR lpDestSubKey, HKEY hSrcKey, LPCTSTR l
     do
     {
         cbName = sizeof(szSubKey) / sizeof(szSubKey[0]);
-        lResult = RegEnumKeyEx(hSrcKey, dwIndex++, szSubKey, &cbName, NULL, NULL, NULL, &ft);
+        lResult = RegEnumKeyExW(hSrcKey, dwIndex++, szSubKey, &cbName, NULL, NULL, NULL, &ft);
         if (lResult == ERROR_SUCCESS)
         {
             lResult = CopyKey(hDestSubKey, szSubKey, hSrcKey, szSubKey);
@@ -1406,10 +2027,10 @@ static LONG CopyKey(HKEY hDestKey, LPCTSTR lpDestSubKey, HKEY hSrcKey, LPCTSTR l
     {
         cbName = sizeof(szValueName) / sizeof(szValueName[0]);
         cbData = sizeof(szValueData) / sizeof(szValueData[0]);
-        lResult = RegEnumValue(hSrcKey, dwIndex++, szValueName, &cbName, NULL, &dwType, szValueData, &cbData);
+        lResult = RegEnumValueW(hSrcKey, dwIndex++, szValueName, &cbName, NULL, &dwType, szValueData, &cbData);
         if (lResult == ERROR_SUCCESS)
         {
-            lResult = RegSetValueEx(hDestSubKey, szValueName, 0, dwType, szValueData, cbData);
+            lResult = RegSetValueExW(hDestSubKey, szValueName, 0, dwType, szValueData, cbData);
             if (lResult)
                 goto done;
         }
@@ -1428,13 +2049,19 @@ done:
     return lResult;
 }
 
-static LONG MoveKey(HKEY hDestKey, LPCTSTR lpDestSubKey, HKEY hSrcKey, LPCTSTR lpSrcSubKey)
+static LONG MoveKey(HKEY hDestKey, LPCWSTR lpDestSubKey, HKEY hSrcKey, LPCWSTR lpSrcSubKey)
 {
     LONG lResult;
 
     if (!lpSrcSubKey)
         return ERROR_INVALID_FUNCTION;
 
+    if (_wcsicmp(lpDestSubKey, lpSrcSubKey) == 0)
+    {
+        /* Destination name equals source name */
+        return ERROR_SUCCESS;
+    }
+
     lResult = CopyKey(hDestKey, lpDestSubKey, hSrcKey, lpSrcSubKey);
     if (lResult == ERROR_SUCCESS)
         SHDeleteKey(hSrcKey, lpSrcSubKey);
@@ -1442,24 +2069,24 @@ static LONG MoveKey(HKEY hDestKey, LPCTSTR lpDestSubKey, HKEY hSrcKey, LPCTSTR l
     return lResult;
 }
 
-BOOL DeleteKey(HWND hwnd, HKEY hKeyRoot, LPCTSTR keyPath)
+BOOL DeleteKey(HWND hwnd, HKEY hKeyRoot, LPCWSTR keyPath)
 {
-    TCHAR msg[128], caption[128];
+    WCHAR msg[128], caption[128];
     BOOL result = FALSE;
     LONG lRet;
     HKEY hKey;
 
-    lRet = RegOpenKeyEx(hKeyRoot, keyPath, 0, KEY_READ|KEY_SET_VALUE, &hKey);
+    lRet = RegOpenKeyExW(hKeyRoot, keyPath, 0, KEY_READ|KEY_SET_VALUE, &hKey);
     if (lRet != ERROR_SUCCESS)
     {
         error_code_messagebox(hwnd, lRet);
         return FALSE;
     }
 
-    LoadString(hInst, IDS_QUERY_DELETE_KEY_CONFIRM, caption, sizeof(caption)/sizeof(TCHAR));
-    LoadString(hInst, IDS_QUERY_DELETE_KEY_ONE, msg, sizeof(msg)/sizeof(TCHAR));
+    LoadStringW(hInst, IDS_QUERY_DELETE_KEY_CONFIRM, caption, ARRAY_SIZE(caption));
+    LoadStringW(hInst, IDS_QUERY_DELETE_KEY_ONE, msg, ARRAY_SIZE(msg));
 
-    if (MessageBox(g_pChildWnd->hWnd, msg, caption, MB_ICONQUESTION | MB_YESNO) != IDYES)
+    if (MessageBoxW(g_pChildWnd->hWnd, msg, caption, MB_ICONQUESTION | MB_YESNO) != IDYES)
         goto done;
 
     lRet = SHDeleteKey(hKeyRoot, keyPath);
@@ -1475,24 +2102,26 @@ done:
     return result;
 }
 
-LONG RenameKey(HKEY hKey, LPCTSTR lpSubKey, LPCTSTR lpNewName)
+LONG RenameKey(HKEY hKey, LPCWSTR lpSubKey, LPCWSTR lpNewName)
 {
-    LPCTSTR s;
-    LPTSTR lpNewSubKey = NULL;
+    LPCWSTR s;
+    LPWSTR lpNewSubKey = NULL;
     LONG Ret = 0;
+    SIZE_T cbNewSubKey;
 
     if (!lpSubKey)
         return Ret;
 
-    s = _tcsrchr(lpSubKey, _T('\\'));
+    s = wcsrchr(lpSubKey, L'\\');
     if (s)
     {
         s++;
-        lpNewSubKey = (LPTSTR) HeapAlloc(GetProcessHeap(), 0, (s - lpSubKey + _tcslen(lpNewName) + 1) * sizeof(TCHAR));
+        cbNewSubKey = (s - lpSubKey + wcslen(lpNewName) + 1) * sizeof(WCHAR);
+        lpNewSubKey = (LPWSTR) HeapAlloc(GetProcessHeap(), 0, cbNewSubKey);
         if (lpNewSubKey != NULL)
         {
-            memcpy(lpNewSubKey, lpSubKey, (s - lpSubKey) * sizeof(TCHAR));
-            lstrcpy(lpNewSubKey + (s - lpSubKey), lpNewName);
+            StringCbCopyNW(lpNewSubKey, cbNewSubKey, lpSubKey, (s - lpSubKey) * sizeof(WCHAR));
+            StringCbCatW(lpNewSubKey, cbNewSubKey, lpNewName);
             lpNewName = lpNewSubKey;
         }
         else
@@ -1508,7 +2137,7 @@ LONG RenameKey(HKEY hKey, LPCTSTR lpSubKey, LPCTSTR lpNewName)
     return Ret;
 }
 
-LONG RenameValue(HKEY hKey, LPCTSTR lpSubKey, LPCTSTR lpDestValue, LPCTSTR lpSrcValue)
+LONG RenameValue(HKEY hKey, LPCWSTR lpSubKey, LPCWSTR lpDestValue, LPCWSTR lpSrcValue)
 {
     LONG lResult;
     HKEY hSubKey = NULL;
@@ -1517,18 +2146,18 @@ LONG RenameValue(HKEY hKey, LPCTSTR lpSubKey, LPCTSTR lpDestValue, LPCTSTR lpSrc
 
     if (lpSubKey)
     {
-        lResult = RegOpenKey(hKey, lpSubKey, &hSubKey);
+        lResult = RegOpenKeyW(hKey, lpSubKey, &hSubKey);
         if (lResult != ERROR_SUCCESS)
             goto done;
         hKey = hSubKey;
     }
 
     cbData = sizeof(data);
-    lResult = RegQueryValueEx(hKey, lpSrcValue, NULL, &dwType, data, &cbData);
+    lResult = RegQueryValueExW(hKey, lpSrcValue, NULL, &dwType, data, &cbData);
     if (lResult != ERROR_SUCCESS)
         goto done;
 
-    lResult = RegSetValueEx(hKey, lpDestValue, 0, dwType, data, cbData);
+    lResult = RegSetValueExW(hKey, lpDestValue, 0, dwType, data, cbData);
     if (lResult != ERROR_SUCCESS)
         goto done;
 
@@ -1540,7 +2169,7 @@ done:
     return lResult;
 }
 
-LONG QueryStringValue(HKEY hKey, LPCTSTR lpSubKey, LPCTSTR lpValueName, LPTSTR pszBuffer, DWORD dwBufferLen)
+LONG QueryStringValue(HKEY hKey, LPCWSTR lpSubKey, LPCWSTR lpValueName, LPWSTR pszBuffer, DWORD dwBufferLen)
 {
     LONG lResult;
     HKEY hSubKey = NULL;
@@ -1548,14 +2177,14 @@ LONG QueryStringValue(HKEY hKey, LPCTSTR lpSubKey, LPCTSTR lpValueName, LPTSTR p
 
     if (lpSubKey)
     {
-        lResult = RegOpenKey(hKey, lpSubKey, &hSubKey);
+        lResult = RegOpenKeyW(hKey, lpSubKey, &hSubKey);
         if (lResult != ERROR_SUCCESS)
             goto done;
         hKey = hSubKey;
     }
 
     cbData = (dwBufferLen - 1) * sizeof(*pszBuffer);
-    lResult = RegQueryValueEx(hKey, lpValueName, NULL, &dwType, (LPBYTE) pszBuffer, &cbData);
+    lResult = RegQueryValueExW(hKey, lpValueName, NULL, &dwType, (LPBYTE) pszBuffer, &cbData);
     if (lResult != ERROR_SUCCESS)
         goto done;
     if (dwType != REG_SZ)
@@ -1564,38 +2193,38 @@ LONG QueryStringValue(HKEY hKey, LPCTSTR lpSubKey, LPCTSTR lpValueName, LPTSTR p
         goto done;
     }
 
-    pszBuffer[cbData / sizeof(*pszBuffer)] = _T('\0');
+    pszBuffer[cbData / sizeof(*pszBuffer)] = L'\0';
 
 done:
     if (lResult != ERROR_SUCCESS)
-        pszBuffer[0] = _T('\0');
+        pszBuffer[0] = L'\0';
     if (hSubKey)
         RegCloseKey(hSubKey);
     return lResult;
 }
 
-BOOL GetKeyName(LPTSTR pszDest, size_t iDestLength, HKEY hRootKey, LPCTSTR lpSubKey)
+BOOL GetKeyName(LPWSTR pszDest, size_t iDestLength, HKEY hRootKey, LPCWSTR lpSubKey)
 {
-    LPCTSTR pszRootKey;
+    LPCWSTR pszRootKey;
 
     if (hRootKey == HKEY_CLASSES_ROOT)
-        pszRootKey = TEXT("HKEY_CLASSES_ROOT");
+        pszRootKey = L"HKEY_CLASSES_ROOT";
     else if (hRootKey == HKEY_CURRENT_USER)
-        pszRootKey = TEXT("HKEY_CURRENT_USER");
+        pszRootKey = L"HKEY_CURRENT_USER";
     else if (hRootKey == HKEY_LOCAL_MACHINE)
-        pszRootKey = TEXT("HKEY_LOCAL_MACHINE");
+        pszRootKey = L"HKEY_LOCAL_MACHINE";
     else if (hRootKey == HKEY_USERS)
-        pszRootKey = TEXT("HKEY_USERS");
+        pszRootKey = L"HKEY_USERS";
     else if (hRootKey == HKEY_CURRENT_CONFIG)
-        pszRootKey = TEXT("HKEY_CURRENT_CONFIG");
+        pszRootKey = L"HKEY_CURRENT_CONFIG";
     else if (hRootKey == HKEY_DYN_DATA)
-        pszRootKey = TEXT("HKEY_DYN_DATA");
+        pszRootKey = L"HKEY_DYN_DATA";
     else
         return FALSE;
 
     if (lpSubKey[0])
-        _sntprintf(pszDest, iDestLength, TEXT("%s\\%s"), pszRootKey, lpSubKey);
+        _snwprintf(pszDest, iDestLength, L"%s\\%s", pszRootKey, lpSubKey);
     else
-        _sntprintf(pszDest, iDestLength, TEXT("%s"), pszRootKey);
+        _snwprintf(pszDest, iDestLength, L"%s", pszRootKey);
     return TRUE;
 }