--- trunk/reactos/lib/setupapi/devinst.c 2005-01-25 01:23:23 UTC (rev 13264)
+++ trunk/reactos/lib/setupapi/devinst.c 2005-01-25 01:35:43 UTC (rev 13265)
@@ -25,6 +25,7 @@
#include "windef.h"
#include "winbase.h"
+#include "winnt.h"
#include "winreg.h"
#include "winternl.h"
#include "wingdi.h"
@@ -41,13 +42,28 @@
WINE_DEFAULT_DEBUG_CHANNEL(setupapi);
/* Unicode constants */
+static const WCHAR ClassGUID[] = {'C','l','a','s','s','G','U','I','D',0};
+static const WCHAR Class[] = {'C','l','a','s','s',0};
+static const WCHAR ClassInstall32[] = {'C','l','a','s','s','I','n','s','t','a','l','l','3','2',0};
+static const WCHAR NoDisplayClass[] = {'N','o','D','i','s','p','l','a','y','C','l','a','s','s',0};
+static const WCHAR NoInstallClass[] = {'N','o','I','s','t','a','l','l','C','l','a','s','s',0};
+static const WCHAR NoUseClass[] = {'N','o','U','s','e','C','l','a','s','s',0};
static const WCHAR NtExtension[] = {'.','N','T',0};
static const WCHAR NtPlatformExtension[] = {'.','N','T','x','8','6',0};
+static const WCHAR Version[] = {'V','e','r','s','i','o','n',0};
static const WCHAR WinExtension[] = {'.','W','i','n',0};
-static const WCHAR ClassInstall32[] = {'C','l','a','s','s','I','n','s','t','a','l','l','3','2',0};
-static const WCHAR Class[] = {'C','l','a','s','s',0};
+/* Registry key and value names */
+static const WCHAR ControlClass[] = {'S','y','s','t','e','m','\\',
+ 'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\',
+ 'C','o','n','t','r','o','l','\\',
+ 'C','l','a','s','s',0};
+static const WCHAR DeviceClasses[] = {'S','y','s','t','e','m','\\',
+ 'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\',
+ 'C','o','n','t','r','o','l','\\',
+ 'D','e','v','i','c','e','C','l','a','s','s','e','s',0};
+
/***********************************************************************
* SetupDiBuildClassInfoList (SETUPAPI.@)
*/
@@ -57,7 +73,7 @@
DWORD ClassGuidListSize,
PDWORD RequiredSize)
{
- TRACE("SetupDiBuildClassInfoList() called\n");
+ TRACE("\n");
return SetupDiBuildClassInfoListExW(Flags, ClassGuidList,
ClassGuidListSize, RequiredSize,
NULL, NULL);
@@ -97,7 +113,7 @@
LONG lError;
DWORD dwGuidListIndex = 0;
- TRACE("SetupDiBuildClassInfoListExW() called\n");
+ TRACE("\n");
if (RequiredSize != NULL)
*RequiredSize = 0;
@@ -126,7 +142,7 @@
TRACE("RegEnumKeyExW() returns %ld\n", lError);
if (lError == ERROR_SUCCESS || lError == ERROR_MORE_DATA)
{
- TRACE("Key name: %S\n", szKeyName);
+ TRACE("Key name: %p\n", szKeyName);
if (RegOpenKeyExW(hClassesKey,
szKeyName,
@@ -139,7 +155,7 @@
}
if (!RegQueryValueExW(hClassKey,
- L"NoUseClass",
+ NoUseClass,
NULL,
NULL,
NULL,
@@ -152,7 +168,7 @@
if ((Flags & DIBCI_NOINSTALLCLASS) &&
(!RegQueryValueExW(hClassKey,
- L"NoInstallClass",
+ NoInstallClass,
NULL,
NULL,
NULL,
@@ -165,7 +181,7 @@
if ((Flags & DIBCI_NODISPLAYCLASS) &&
(!RegQueryValueExW(hClassKey,
- L"NoDisplayClass",
+ NoDisplayClass,
NULL,
NULL,
NULL,
@@ -178,14 +194,14 @@
RegCloseKey(hClassKey);
- TRACE("Guid: %S\n", szKeyName);
+ TRACE("Guid: %p\n", szKeyName);
if (dwGuidListIndex < ClassGuidListSize)
{
if (szKeyName[0] == L'{' && szKeyName[37] == L'}')
{
szKeyName[37] = 0;
}
- TRACE("Guid: %S\n", &szKeyName[1]);
+ TRACE("Guid: %p\n", &szKeyName[1]);
UuidFromStringW(&szKeyName[1],
&ClassGuidList[dwGuidListIndex]);
@@ -302,7 +318,7 @@
TRACE("RegEnumKeyExW() returns %ld\n", lError);
if (lError == ERROR_SUCCESS || lError == ERROR_MORE_DATA)
{
- TRACE("Key name: %S\n", szKeyName);
+ TRACE("Key name: %p\n", szKeyName);
if (RegOpenKeyExW(hClassesKey,
szKeyName,
@@ -322,20 +338,20 @@
(LPBYTE)szClassName,
&dwLength))
{
- TRACE("Class name: %S\n", szClassName);
+ TRACE("Class name: %p\n", szClassName);
- if (_wcsicmp(szClassName, ClassName) == 0)
+ if (strcmpiW(szClassName, ClassName) == 0)
{
TRACE("Found matching class name\n");
- TRACE("Guid: %S\n", szKeyName);
+ TRACE("Guid: %p\n", szKeyName);
if (dwGuidListIndex < ClassGuidListSize)
{
if (szKeyName[0] == L'{' && szKeyName[37] == L'}')
{
szKeyName[37] = 0;
}
- TRACE("Guid: %S\n", &szKeyName[1]);
+ TRACE("Guid: %p\n", &szKeyName[1]);
UuidFromStringW(&szKeyName[1],
&ClassGuidList[dwGuidListIndex]);
@@ -508,7 +524,7 @@
*/
BOOL WINAPI SetupDiDestroyDeviceInfoList(HDEVINFO devinfo)
{
- FIXME("%04lx\n", (DWORD)devinfo);
+ FIXME("%p\n", devinfo);
return FALSE;
}
@@ -571,13 +587,13 @@
PWSTR *Extension)
{
WCHAR szBuffer[MAX_PATH];
- OSVERSIONINFO OsVersionInfo;
+ OSVERSIONINFOW OsVersionInfo;
DWORD dwLength;
DWORD dwFullLength;
LONG lLineCount = -1;
- OsVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
- if (!GetVersionEx(&OsVersionInfo))
+ OsVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFOW);
+ if (!GetVersionExW(&OsVersionInfo))
{
return FALSE;
}
@@ -707,7 +723,7 @@
Reserved);
if (hKey == INVALID_HANDLE_VALUE)
{
- ERR("SetupDiOpenClassRegKeyExW() failed (Error %lu)\n", GetLastError());
+ WARN("SetupDiOpenClassRegKeyExW() failed (Error %lu)\n", GetLastError());
return FALSE;
}
@@ -855,8 +871,8 @@
if (!SetupGetLineTextW(NULL,
hInf,
- L"Version",
- L"ClassGUID",
+ Version,
+ ClassGUID,
Buffer,
MAX_PATH,
&RequiredSize))
@@ -864,7 +880,7 @@
return INVALID_HANDLE_VALUE;
}
- lstrcpyW(FullBuffer, L"System\\CurrentControlSet\\Control\\Class\\");
+ lstrcpyW(FullBuffer, ControlClass);
lstrcatW(FullBuffer, Buffer);
if (RegOpenKeyExW(HKEY_LOCAL_MACHINE,
@@ -875,8 +891,8 @@
{
if (!SetupGetLineTextW(NULL,
hInf,
- L"Version",
- L"Class",
+ Version,
+ Class,
Buffer,
MAX_PATH,
&RequiredSize))
@@ -900,7 +916,7 @@
}
if (RegSetValueExW(hClassKey,
- L"Class",
+ Class,
0,
REG_SZ,
(LPBYTE)Buffer,
@@ -931,7 +947,7 @@
HKEY hClassKey;
- FIXME("Incomplete function.\n");
+ FIXME("\n");
if ((Flags & DI_NOVCP) && (FileQueue == NULL || FileQueue == INVALID_HANDLE_VALUE))
{
@@ -1001,7 +1017,6 @@
/* FIXME: More code! */
-ByeBye:
if (bFileQueueCreated)
SetupCloseFileQueue(FileQueue);
@@ -1051,7 +1066,7 @@
LPWSTR lpGuidString;
HKEY hClassesKey;
HKEY hClassKey;
- LPWSTR lpKeyName;
+ LPCWSTR lpKeyName;
if (MachineName != NULL)
{
@@ -1061,11 +1076,11 @@
if (Flags == DIOCR_INSTALLER)
{
- lpKeyName = L"SYSTEM\\CurrentControlSet\\Control\\Class";
+ lpKeyName = ControlClass;
}
else if (Flags == DIOCR_INTERFACE)
{
- lpKeyName = L"SYSTEM\\CurrentControlSet\\Control\\DeviceClasses";
+ lpKeyName = DeviceClasses;
}
else
{
@@ -1109,7 +1124,6 @@
return hClassKey;
}
-
/***********************************************************************
* SetupDiOpenDeviceInterfaceA (SETUPAPI.@)
*/
--- trunk/reactos/lib/setupapi/dirid.c 2005-01-25 01:23:23 UTC (rev 13264)
+++ trunk/reactos/lib/setupapi/dirid.c 2005-01-25 01:35:43 UTC (rev 13265)
@@ -29,6 +29,7 @@
#include "winuser.h"
#include "winnls.h"
#include "setupapi.h"
+#include "shlobj.h"
#include "wine/unicode.h"
#include "setupapi_private.h"
#include "wine/debug.h"
@@ -36,6 +37,8 @@
WINE_DEFAULT_DEBUG_CHANNEL(setupapi);
#define MAX_SYSTEM_DIRID DIRID_PRINTPROCESSOR
+#define MIN_CSIDL_DIRID 0x4000
+#define MAX_CSIDL_DIRID 0x403f
struct user_dirid
{
@@ -47,6 +50,7 @@
static int alloc_user_dirids; /* number of allocated user dirids */
static struct user_dirid *user_dirids;
static const WCHAR *system_dirids[MAX_SYSTEM_DIRID+1];
+static const WCHAR *csidl_dirids[MAX_CSIDL_DIRID-MIN_CSIDL_DIRID+1];
/* retrieve the string for unknown dirids */
static const WCHAR *get_unknown_dirid(void)
@@ -64,6 +68,8 @@
return unknown_dirid;
}
+static const WCHAR *get_csidl_dir(DWORD csidl);
+
/* create the string for a system dirid */
static const WCHAR *create_system_dirid( int dirid )
{
@@ -76,8 +82,9 @@
static const WCHAR Viewers[] = {'\\','v','i','e','w','e','r','s',0};
static const WCHAR System[] = {'\\','s','y','s','t','e','m',0};
static const WCHAR Spool[] = {'\\','s','p','o','o','l',0};
+ static const WCHAR UserProfile[] = {'U','S','E','R','P','R','O','F','I','L','E',0};
- WCHAR buffer[MAX_PATH+16], *str;
+ WCHAR buffer[MAX_PATH+32], *str;
int len;
switch(dirid)
@@ -126,9 +133,11 @@
GetWindowsDirectoryW( buffer, MAX_PATH );
strcatW( buffer, Spool );
break;
+ case DIRID_USERPROFILE:
+ if (GetEnvironmentVariableW( UserProfile, buffer, MAX_PATH )) break;
+ return get_csidl_dir(CSIDL_PROFILE);
case DIRID_LOADER:
return C_Root; /* FIXME */
- case DIRID_USERPROFILE: /* FIXME */
case DIRID_COLOR: /* FIXME */
case DIRID_PRINTPROCESSOR: /* FIXME */
default:
@@ -140,6 +149,21 @@
return str;
}
+static const WCHAR *get_csidl_dir( DWORD csidl )
+{
+ WCHAR buffer[MAX_PATH], *str;
+ int len;
+
+ if (!SHGetSpecialFolderPathW( NULL, buffer, csidl, TRUE ))
+ {
+ FIXME( "CSIDL %lx not found\n", csidl );
+ return get_unknown_dirid();
+ }
+ len = (strlenW(buffer) + 1) * sizeof(WCHAR);
+ if ((str = HeapAlloc( GetProcessHeap(), 0, len ))) memcpy( str, buffer, len );
+ return str;
+}
+
/* retrieve the string corresponding to a dirid, or NULL if none */
const WCHAR *DIRID_get_string( HINF hinf, int dirid )
{
@@ -154,6 +178,13 @@
ERR("user id %d not found\n", dirid );
return NULL;
}
+ else if (dirid >= MIN_CSIDL_DIRID)
+ {
+ if (dirid > MAX_CSIDL_DIRID) return get_unknown_dirid();
+ dirid -= MIN_CSIDL_DIRID;
+ if (!csidl_dirids[dirid]) csidl_dirids[dirid] = get_csidl_dir( dirid );
+ return csidl_dirids[dirid];
+ }
else
{
if (dirid > MAX_SYSTEM_DIRID) return get_unknown_dirid();