diff --git a/reactos/lib/setupapi/De.rc b/reactos/lib/setupapi/De.rc deleted file mode 100644 index f8e1e3e36ec..00000000000 --- a/reactos/lib/setupapi/De.rc +++ /dev/null @@ -1,34 +0,0 @@ -/* - * German resources for SETUPAPI - * - * Copyright 2004 Michael Wirth - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -LANGUAGE LANG_GERMAN, SUBLANG_GERMAN - -COPYFILEDLGORD DIALOG LOADONCALL MOVEABLE DISCARDABLE 20, 20, 208, 105 -STYLE DS_MODALFRAME | DS_SETFONT | WS_POPUP | WS_VISIBLE | WS_CAPTION -CAPTION "Kopiere Dateien..." -FONT 8, "MS Sans Serif" -BEGIN - PUSHBUTTON "Abbrechen", IDCANCEL, 79, 84, 50, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP - LTEXT "Quelltext:", -1, 7, 7, 77, 11, WS_CHILD | WS_VISIBLE | WS_GROUP - LTEXT "", SOURCESTRORD, 7, 18, 194, 11, WS_CHILD | WS_VISIBLE | WS_GROUP - LTEXT "Ziel:", -1, 7, 30, 77, 11, WS_CHILD | WS_VISIBLE | WS_GROUP - LTEXT "", DESTSTRORD, 7, 41, 194, 22, WS_CHILD | WS_VISIBLE | WS_GROUP - CONTROL "", PROGRESSORD, "setupx_progress", 7, 63, 194, 13, WS_CHILD | WS_VISIBLE | WS_TABSTOP -END diff --git a/reactos/lib/setupapi/En.rc b/reactos/lib/setupapi/En.rc deleted file mode 100644 index 088f6aaa035..00000000000 --- a/reactos/lib/setupapi/En.rc +++ /dev/null @@ -1,34 +0,0 @@ -/* - * English resources for SETUPAPI - * - * Copyright 2001 Andreas Mohr - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT - -COPYFILEDLGORD DIALOG LOADONCALL MOVEABLE DISCARDABLE 20, 20, 208, 105 -STYLE DS_MODALFRAME | DS_SETFONT | WS_POPUP | WS_VISIBLE | WS_CAPTION -CAPTION "Copying Files..." -FONT 8, "MS Sans Serif" -BEGIN - PUSHBUTTON "Cancel", IDCANCEL, 79, 84, 50, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP - LTEXT "Source:", -1, 7, 7, 77, 11, WS_CHILD | WS_VISIBLE | WS_GROUP - LTEXT "", SOURCESTRORD, 7, 18, 194, 11, WS_CHILD | WS_VISIBLE | WS_GROUP - LTEXT "Destination:", -1, 7, 30, 77, 11, WS_CHILD | WS_VISIBLE | WS_GROUP - LTEXT "", DESTSTRORD, 7, 41, 194, 22, WS_CHILD | WS_VISIBLE | WS_GROUP - CONTROL "", PROGRESSORD, "setupx_progress", 7, 63, 194, 13, WS_CHILD | WS_VISIBLE | WS_TABSTOP -END diff --git a/reactos/lib/setupapi/Es.rc b/reactos/lib/setupapi/Es.rc deleted file mode 100644 index efa01ea412c..00000000000 --- a/reactos/lib/setupapi/Es.rc +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Spanish resources for SETUPAPI - * - * Copyright 2003 José Manuel Ferrer Ortiz - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -LANGUAGE LANG_SPANISH, SUBLANG_DEFAULT - -COPYFILEDLGORD DIALOG LOADONCALL MOVEABLE DISCARDABLE 20, 20, 208, 105 -STYLE DS_MODALFRAME | DS_SETFONT | WS_POPUP | WS_VISIBLE | WS_CAPTION -CAPTION "Copiando archivos..." -FONT 8, "MS Sans Serif" -BEGIN - PUSHBUTTON "Cancelar", IDCANCEL, 79, 84, 50, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP - LTEXT "Origen:", -1, 7, 7, 77, 11, WS_CHILD | WS_VISIBLE | WS_GROUP - LTEXT "", SOURCESTRORD, 7, 18, 194, 11, WS_CHILD | WS_VISIBLE | WS_GROUP - LTEXT "Destino:", -1, 7, 30, 77, 11, WS_CHILD | WS_VISIBLE | WS_GROUP - LTEXT "", DESTSTRORD, 7, 41, 194, 22, WS_CHILD | WS_VISIBLE | WS_GROUP - CONTROL "", PROGRESSORD, "setupx_progress", 7, 63, 194, 13, WS_CHILD | WS_VISIBLE | WS_TABSTOP -END diff --git a/reactos/lib/setupapi/Fr.rc b/reactos/lib/setupapi/Fr.rc deleted file mode 100644 index 1821aac661b..00000000000 --- a/reactos/lib/setupapi/Fr.rc +++ /dev/null @@ -1,35 +0,0 @@ -/* - * French resources for SETUPAPI - * - * Copyright 2001 Andreas Mohr - * Copyright 2003 Vincent Béron - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -LANGUAGE LANG_FRENCH, SUBLANG_NEUTRAL - -COPYFILEDLGORD DIALOG LOADONCALL MOVEABLE DISCARDABLE 20, 20, 208, 105 -STYLE DS_MODALFRAME | DS_SETFONT | WS_POPUP | WS_VISIBLE | WS_CAPTION -CAPTION "Copie de fichiers..." -FONT 8, "MS Sans Serif" -BEGIN - PUSHBUTTON "Annuler", IDCANCEL, 79, 84, 50, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP - LTEXT "Source:", -1, 7, 7, 77, 11, WS_CHILD | WS_VISIBLE | WS_GROUP - LTEXT "", SOURCESTRORD, 7, 18, 194, 11, WS_CHILD | WS_VISIBLE | WS_GROUP - LTEXT "Destination:", -1, 7, 30, 77, 11, WS_CHILD | WS_VISIBLE | WS_GROUP - LTEXT "", DESTSTRORD, 7, 41, 194, 22, WS_CHILD | WS_VISIBLE | WS_GROUP - CONTROL "", PROGRESSORD, "setupx_progress", 7, 63, 194, 13, WS_CHILD | WS_VISIBLE | WS_TABSTOP -END diff --git a/reactos/lib/setupapi/It.rc b/reactos/lib/setupapi/It.rc deleted file mode 100644 index 816aa47067c..00000000000 --- a/reactos/lib/setupapi/It.rc +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Italian resources for SETUPAPI - * - * Copyright 2001 Andreas Mohr - * Copyright 2003 Ivan Leo Murray-Smith - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -LANGUAGE LANG_ITALIAN, SUBLANG_DEFAULT - -COPYFILEDLGORD DIALOG LOADONCALL MOVEABLE DISCARDABLE 20, 20, 208, 105 -STYLE DS_MODALFRAME | DS_SETFONT | WS_POPUP | WS_VISIBLE | WS_CAPTION -CAPTION "Copia dei file in corso..." -FONT 8, "MS Sans Serif" -BEGIN - PUSHBUTTON "Anulla", IDCANCEL, 79, 84, 50, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP - LTEXT "Origine:", -1, 7, 7, 77, 11, WS_CHILD | WS_VISIBLE | WS_GROUP - LTEXT "", SOURCESTRORD, 7, 18, 194, 11, WS_CHILD | WS_VISIBLE | WS_GROUP - LTEXT "Destinazione:", -1, 7, 30, 77, 11, WS_CHILD | WS_VISIBLE | WS_GROUP - LTEXT "", DESTSTRORD, 7, 41, 194, 22, WS_CHILD | WS_VISIBLE | WS_GROUP - CONTROL "", PROGRESSORD, "setupx_progress", 7, 63, 194, 13, WS_CHILD | WS_VISIBLE | WS_TABSTOP -END diff --git a/reactos/lib/setupapi/Makefile.in b/reactos/lib/setupapi/Makefile.in deleted file mode 100644 index 0732ffb5b09..00000000000 --- a/reactos/lib/setupapi/Makefile.in +++ /dev/null @@ -1,33 +0,0 @@ -EXTRADEFS = -D_SETUPAPI_ -TOPSRCDIR = @top_srcdir@ -TOPOBJDIR = ../.. -SRCDIR = @srcdir@ -VPATH = @srcdir@ -MODULE = setupapi.dll -IMPORTS = user32 version advapi32 kernel32 ntdll rpcrt4 -ALTNAMES = setupx.dll -EXTRALIBS = $(LIBUNICODE) - -SPEC_SRCS16 = $(ALTNAMES:.dll=.spec) - -C_SRCS = \ - devinst.c \ - dirid.c \ - diskspace.c \ - install.c \ - parser.c \ - queue.c \ - setupcab.c \ - stubs.c - -C_SRCS16 = \ - devinst16.c \ - infparse.c \ - setupx_main.c \ - virtcopy.c - -RC_SRCS= setupapi.rc - -@MAKE_DLL_RULES@ - -### Dependencies: diff --git a/reactos/lib/setupapi/Makefile.ros-template b/reactos/lib/setupapi/Makefile.ros-template deleted file mode 100644 index 2691ec35c6d..00000000000 --- a/reactos/lib/setupapi/Makefile.ros-template +++ /dev/null @@ -1,21 +0,0 @@ -# $Id$ - -TARGET_NAME = setupapi - -TARGET_OBJECTS = @C_SRCS@ - -TARGET_CFLAGS = @EXTRADEFS@ -D__REACTOS__ -D__WINESRC__ - -TARGET_SDKLIBS = @IMPORTS@ wine.a ntdll.a wine_unicode.a - -TARGET_BASE = $(TARGET_BASE_LIB_SETUPAPI) - -TARGET_RC_SRCS = @RC_SRCS@ -TARGET_RC_BINSRC = @RC_BINSRC@ -TARGET_RC_BINARIES = @RC_BINARIES@ - -default: all - -DEP_OBJECTS = $(TARGET_OBJECTS) - -include $(TOOLS_PATH)/depend.mk diff --git a/reactos/lib/setupapi/Nl.rc b/reactos/lib/setupapi/Nl.rc deleted file mode 100644 index a60d3528bfa..00000000000 --- a/reactos/lib/setupapi/Nl.rc +++ /dev/null @@ -1,34 +0,0 @@ -/* - * setupapi (Dutch resources) - * - * Copyright 2003 Hans Leidekker - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -LANGUAGE LANG_DUTCH, SUBLANG_DEFAULT - -COPYFILEDLGORD DIALOG LOADONCALL MOVEABLE DISCARDABLE 20, 20, 208, 105 -STYLE DS_MODALFRAME | DS_SETFONT | WS_POPUP | WS_VISIBLE | WS_CAPTION -CAPTION "Bestanden worden gekopiëerd..." -FONT 8, "MS Sans Serif" -BEGIN - PUSHBUTTON "Annuleren", IDCANCEL, 79, 84, 50, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP - LTEXT "Bron:", -1, 7, 7, 77, 11, WS_CHILD | WS_VISIBLE | WS_GROUP - LTEXT "", SOURCESTRORD, 7, 18, 194, 11, WS_CHILD | WS_VISIBLE | WS_GROUP - LTEXT "Bestemming:", -1, 7, 30, 77, 11, WS_CHILD | WS_VISIBLE | WS_GROUP - LTEXT "", DESTSTRORD, 7, 41, 194, 22, WS_CHILD | WS_VISIBLE | WS_GROUP - CONTROL "", PROGRESSORD, "setupx_progress", 7, 63, 194, 13, WS_CHILD | WS_VISIBLE | WS_TABSTOP -END diff --git a/reactos/lib/setupapi/Pt.rc b/reactos/lib/setupapi/Pt.rc deleted file mode 100644 index ab1f3b78988..00000000000 --- a/reactos/lib/setupapi/Pt.rc +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Portuguese resources for SETUPAPI - * - * Copyright 2003 Marcelo Duarte - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -LANGUAGE LANG_PORTUGUESE, SUBLANG_DEFAULT - -COPYFILEDLGORD DIALOG LOADONCALL MOVEABLE DISCARDABLE 20, 20, 208, 105 -STYLE DS_MODALFRAME | DS_SETFONT | WS_POPUP | WS_VISIBLE | WS_CAPTION -CAPTION "Copiando arquivos..." -FONT 8, "MS Sans Serif" -BEGIN - PUSHBUTTON "Cancelar", IDCANCEL, 79, 84, 50, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP - LTEXT "Origem:", -1, 7, 7, 77, 11, WS_CHILD | WS_VISIBLE | WS_GROUP - LTEXT "", SOURCESTRORD, 7, 18, 194, 11, WS_CHILD | WS_VISIBLE | WS_GROUP - LTEXT "Destino:", -1, 7, 30, 77, 11, WS_CHILD | WS_VISIBLE | WS_GROUP - LTEXT "", DESTSTRORD, 7, 41, 194, 22, WS_CHILD | WS_VISIBLE | WS_GROUP - CONTROL "", PROGRESSORD, "setupx_progress", 7, 63, 194, 13, WS_CHILD | WS_VISIBLE | WS_TABSTOP -END diff --git a/reactos/lib/setupapi/Ru.rc b/reactos/lib/setupapi/Ru.rc deleted file mode 100644 index dc8523a8c4c..00000000000 --- a/reactos/lib/setupapi/Ru.rc +++ /dev/null @@ -1,34 +0,0 @@ -/* - * SETUPAPI (Russian resources) - * - * Copyright 2003 Igor Stepin - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT - -COPYFILEDLGORD DIALOG LOADONCALL MOVEABLE DISCARDABLE 20, 20, 208, 105 -STYLE DS_MODALFRAME | DS_SETFONT | WS_POPUP | WS_VISIBLE | WS_CAPTION -CAPTION "Êîïèðîâàíèå ôàéëîâ..." -FONT 8, "MS Sans Serif" -BEGIN - PUSHBUTTON "Îòìåíà", IDCANCEL, 79, 84, 50, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP - LTEXT "Îòêóäà:", -1, 7, 7, 77, 11, WS_CHILD | WS_VISIBLE | WS_GROUP - LTEXT "", SOURCESTRORD, 7, 18, 194, 11, WS_CHILD | WS_VISIBLE | WS_GROUP - LTEXT "Êóäà:", -1, 7, 30, 77, 11, WS_CHILD | WS_VISIBLE | WS_GROUP - LTEXT "", DESTSTRORD, 7, 41, 194, 22, WS_CHILD | WS_VISIBLE | WS_GROUP - CONTROL "", PROGRESSORD, "setupx_progress", 7, 63, 194, 13, WS_CHILD | WS_VISIBLE | WS_TABSTOP -END diff --git a/reactos/lib/setupapi/devinst.c b/reactos/lib/setupapi/devinst.c deleted file mode 100644 index a571ea44b63..00000000000 --- a/reactos/lib/setupapi/devinst.c +++ /dev/null @@ -1,1106 +0,0 @@ -/* - * SetupAPI device installer - * - * Copyright 2000 Andreas Mohr for CodeWeavers - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include - -#include "windef.h" -#include "winbase.h" -#include "winreg.h" -#include "winternl.h" -#include "wingdi.h" -#include "winuser.h" -#include "winnls.h" -#include "setupapi.h" -#include "wine/debug.h" - -#include "rpc.h" -#include "rpcdce.h" - - -WINE_DEFAULT_DEBUG_CHANNEL(setupapi); - -/* Unicode constants */ -static const WCHAR NtExtension[] = {'.','N','T',0}; -static const WCHAR NtPlatformExtension[] = {'.','N','T','x','8','6',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}; - - -/*********************************************************************** - * SetupDiBuildClassInfoList (SETUPAPI.@) - */ -BOOL WINAPI SetupDiBuildClassInfoList( - DWORD Flags, - LPGUID ClassGuidList, - DWORD ClassGuidListSize, - PDWORD RequiredSize) -{ - TRACE("SetupDiBuildClassInfoList() called\n"); - return SetupDiBuildClassInfoListExW(Flags, ClassGuidList, - ClassGuidListSize, RequiredSize, - NULL, NULL); -} - -/*********************************************************************** - * SetupDiBuildClassInfoListExA (SETUPAPI.@) - */ -BOOL WINAPI SetupDiBuildClassInfoListExA( - DWORD Flags, - LPGUID ClassGuidList, - DWORD ClassGuidListSize, - PDWORD RequiredSize, - LPCSTR MachineName, - PVOID Reserved) -{ - FIXME("\n"); - return FALSE; -} - -/*********************************************************************** - * SetupDiBuildClassInfoListExW (SETUPAPI.@) - */ -BOOL WINAPI SetupDiBuildClassInfoListExW( - DWORD Flags, - LPGUID ClassGuidList, - DWORD ClassGuidListSize, - PDWORD RequiredSize, - LPCWSTR MachineName, - PVOID Reserved) -{ - WCHAR szKeyName[40]; - HKEY hClassesKey; - HKEY hClassKey; - DWORD dwLength; - DWORD dwIndex; - LONG lError; - DWORD dwGuidListIndex = 0; - - TRACE("SetupDiBuildClassInfoListExW() called\n"); - - if (RequiredSize != NULL) - *RequiredSize = 0; - - hClassesKey = SetupDiOpenClassRegKeyExW(NULL, - KEY_ALL_ACCESS, - DIOCR_INSTALLER, - MachineName, - Reserved); - if (hClassesKey == INVALID_HANDLE_VALUE) - { - return FALSE; - } - - for (dwIndex = 0; ; dwIndex++) - { - dwLength = 40; - lError = RegEnumKeyExW(hClassesKey, - dwIndex, - szKeyName, - &dwLength, - NULL, - NULL, - NULL, - NULL); - TRACE("RegEnumKeyExW() returns %ld\n", lError); - if (lError == ERROR_SUCCESS || lError == ERROR_MORE_DATA) - { - TRACE("Key name: %S\n", szKeyName); - - if (RegOpenKeyExW(hClassesKey, - szKeyName, - 0, - KEY_ALL_ACCESS, - &hClassKey)) - { - RegCloseKey(hClassesKey); - return FALSE; - } - - if (!RegQueryValueExW(hClassKey, - L"NoUseClass", - NULL, - NULL, - NULL, - NULL)) - { - TRACE("'NoUseClass' value found!\n"); - RegCloseKey(hClassKey); - continue; - } - - if ((Flags & DIBCI_NOINSTALLCLASS) && - (!RegQueryValueExW(hClassKey, - L"NoInstallClass", - NULL, - NULL, - NULL, - NULL))) - { - TRACE("'NoInstallClass' value found!\n"); - RegCloseKey(hClassKey); - continue; - } - - if ((Flags & DIBCI_NODISPLAYCLASS) && - (!RegQueryValueExW(hClassKey, - L"NoDisplayClass", - NULL, - NULL, - NULL, - NULL))) - { - TRACE("'NoDisplayClass' value found!\n"); - RegCloseKey(hClassKey); - continue; - } - - RegCloseKey(hClassKey); - - TRACE("Guid: %S\n", szKeyName); - if (dwGuidListIndex < ClassGuidListSize) - { - if (szKeyName[0] == L'{' && szKeyName[37] == L'}') - { - szKeyName[37] = 0; - } - TRACE("Guid: %S\n", &szKeyName[1]); - - UuidFromStringW(&szKeyName[1], - &ClassGuidList[dwGuidListIndex]); - } - - dwGuidListIndex++; - } - - if (lError != ERROR_SUCCESS) - break; - } - - RegCloseKey(hClassesKey); - - if (RequiredSize != NULL) - *RequiredSize = dwGuidListIndex; - - if (ClassGuidListSize < dwGuidListIndex) - { - SetLastError(ERROR_INSUFFICIENT_BUFFER); - return FALSE; - } - - return TRUE; -} - -/*********************************************************************** - * SetupDiClassGuidsFromNameA (SETUPAPI.@) - */ -BOOL WINAPI SetupDiClassGuidsFromNameA( - LPCSTR ClassName, - LPGUID ClassGuidList, - DWORD ClassGuidListSize, - PDWORD RequiredSize) -{ - return SetupDiClassGuidsFromNameExA(ClassName, ClassGuidList, - ClassGuidListSize, RequiredSize, - NULL, NULL); -} - -/*********************************************************************** - * SetupDiClassGuidsFromNameW (SETUPAPI.@) - */ -BOOL WINAPI SetupDiClassGuidsFromNameW( - LPCWSTR ClassName, - LPGUID ClassGuidList, - DWORD ClassGuidListSize, - PDWORD RequiredSize) -{ - return SetupDiClassGuidsFromNameExW(ClassName, ClassGuidList, - ClassGuidListSize, RequiredSize, - NULL, NULL); -} - -/*********************************************************************** - * SetupDiClassGuidsFromNameExA (SETUPAPI.@) - */ -BOOL WINAPI SetupDiClassGuidsFromNameExA( - LPCSTR ClassName, - LPGUID ClassGuidList, - DWORD ClassGuidListSize, - PDWORD RequiredSize, - LPCSTR MachineName, - PVOID Reserved) -{ - FIXME("\n"); - return FALSE; -} - -/*********************************************************************** - * SetupDiClassGuidsFromNameExW (SETUPAPI.@) - */ -BOOL WINAPI SetupDiClassGuidsFromNameExW( - LPCWSTR ClassName, - LPGUID ClassGuidList, - DWORD ClassGuidListSize, - PDWORD RequiredSize, - LPCWSTR MachineName, - PVOID Reserved) -{ - WCHAR szKeyName[40]; - WCHAR szClassName[256]; - HKEY hClassesKey; - HKEY hClassKey; - DWORD dwLength; - DWORD dwIndex; - LONG lError; - DWORD dwGuidListIndex = 0; - - if (RequiredSize != NULL) - *RequiredSize = 0; - - hClassesKey = SetupDiOpenClassRegKeyExW(NULL, - KEY_ALL_ACCESS, - DIOCR_INSTALLER, - MachineName, - Reserved); - if (hClassesKey == INVALID_HANDLE_VALUE) - { - return FALSE; - } - - for (dwIndex = 0; ; dwIndex++) - { - dwLength = 40; - lError = RegEnumKeyExW(hClassesKey, - dwIndex, - szKeyName, - &dwLength, - NULL, - NULL, - NULL, - NULL); - TRACE("RegEnumKeyExW() returns %ld\n", lError); - if (lError == ERROR_SUCCESS || lError == ERROR_MORE_DATA) - { - TRACE("Key name: %S\n", szKeyName); - - if (RegOpenKeyExW(hClassesKey, - szKeyName, - 0, - KEY_ALL_ACCESS, - &hClassKey)) - { - RegCloseKey(hClassesKey); - return FALSE; - } - - dwLength = 256 * sizeof(WCHAR); - if (!RegQueryValueExW(hClassKey, - Class, - NULL, - NULL, - (LPBYTE)szClassName, - &dwLength)) - { - TRACE("Class name: %S\n", szClassName); - - if (_wcsicmp(szClassName, ClassName) == 0) - { - TRACE("Found matching class name\n"); - - TRACE("Guid: %S\n", szKeyName); - if (dwGuidListIndex < ClassGuidListSize) - { - if (szKeyName[0] == L'{' && szKeyName[37] == L'}') - { - szKeyName[37] = 0; - } - TRACE("Guid: %S\n", &szKeyName[1]); - - UuidFromStringW(&szKeyName[1], - &ClassGuidList[dwGuidListIndex]); - } - - dwGuidListIndex++; - } - } - - RegCloseKey(hClassKey); - } - - if (lError != ERROR_SUCCESS) - break; - } - - RegCloseKey(hClassesKey); - - if (RequiredSize != NULL) - *RequiredSize = dwGuidListIndex; - - if (ClassGuidListSize < dwGuidListIndex) - { - SetLastError(ERROR_INSUFFICIENT_BUFFER); - return FALSE; - } - - return TRUE; -} - -/*********************************************************************** - * SetupDiClassNameFromGuidA (SETUPAPI.@) - */ -BOOL WINAPI SetupDiClassNameFromGuidA( - const GUID* ClassGuid, - PSTR ClassName, - DWORD ClassNameSize, - PDWORD RequiredSize) -{ - return SetupDiClassNameFromGuidExA(ClassGuid, ClassName, - ClassNameSize, RequiredSize, - NULL, NULL); -} - -/*********************************************************************** - * SetupDiClassNameFromGuidW (SETUPAPI.@) - */ -BOOL WINAPI SetupDiClassNameFromGuidW( - const GUID* ClassGuid, - PWSTR ClassName, - DWORD ClassNameSize, - PDWORD RequiredSize) -{ - return SetupDiClassNameFromGuidExW(ClassGuid, ClassName, - ClassNameSize, RequiredSize, - NULL, NULL); -} - -/*********************************************************************** - * SetupDiClassNameFromGuidExA (SETUPAPI.@) - */ -BOOL WINAPI SetupDiClassNameFromGuidExA( - const GUID* ClassGuid, - PSTR ClassName, - DWORD ClassNameSize, - PDWORD RequiredSize, - PCSTR MachineName, - PVOID Reserved) -{ - FIXME("\n"); - return FALSE; -} - -/*********************************************************************** - * SetupDiClassNameFromGuidExW (SETUPAPI.@) - */ -BOOL WINAPI SetupDiClassNameFromGuidExW( - const GUID* ClassGuid, - PWSTR ClassName, - DWORD ClassNameSize, - PDWORD RequiredSize, - PCWSTR MachineName, - PVOID Reserved) -{ - HKEY hKey; - DWORD dwLength; - - hKey = SetupDiOpenClassRegKeyExW(ClassGuid, - KEY_ALL_ACCESS, - DIOCR_INSTALLER, - MachineName, - Reserved); - if (hKey == INVALID_HANDLE_VALUE) - { - return FALSE; - } - - if (RequiredSize != NULL) - { - dwLength = 0; - if (RegQueryValueExW(hKey, - Class, - NULL, - NULL, - NULL, - &dwLength)) - { - RegCloseKey(hKey); - return FALSE; - } - - *RequiredSize = dwLength / sizeof(WCHAR); - } - - dwLength = ClassNameSize * sizeof(WCHAR); - if (RegQueryValueExW(hKey, - Class, - NULL, - NULL, - (LPBYTE)ClassName, - &dwLength)) - { - RegCloseKey(hKey); - return FALSE; - } - - RegCloseKey(hKey); - - return TRUE; -} - -/*********************************************************************** - * SetupDiCreateDeviceInfoList (SETUPAPI.@) - */ -HDEVINFO WINAPI -SetupDiCreateDeviceInfoList(const GUID *ClassGuid, - HWND hwndParent) -{ - return SetupDiCreateDeviceInfoListExW(ClassGuid, hwndParent, NULL, NULL); -} - -/*********************************************************************** - * SetupDiCreateDeviceInfoListExA (SETUPAPI.@) - */ -HDEVINFO WINAPI -SetupDiCreateDeviceInfoListExA(const GUID *ClassGuid, - HWND hwndParent, - PCSTR MachineName, - PVOID Reserved) -{ - FIXME("\n"); - return (HDEVINFO)INVALID_HANDLE_VALUE; -} - -/*********************************************************************** - * SetupDiCreateDeviceInfoListExW (SETUPAPI.@) - */ -HDEVINFO WINAPI -SetupDiCreateDeviceInfoListExW(const GUID *ClassGuid, - HWND hwndParent, - PCWSTR MachineName, - PVOID Reserved) -{ - FIXME("\n"); - return (HDEVINFO)INVALID_HANDLE_VALUE; -} - -/*********************************************************************** - * SetupDiDestroyDeviceInfoList (SETUPAPI.@) - */ -BOOL WINAPI SetupDiDestroyDeviceInfoList(HDEVINFO devinfo) -{ - FIXME("%04lx\n", (DWORD)devinfo); - return FALSE; -} - -/*********************************************************************** - * SetupDiEnumDeviceInfo (SETUPAPI.@) - */ -BOOL WINAPI SetupDiEnumDeviceInfo( - HDEVINFO devinfo, - DWORD index, - PSP_DEVINFO_DATA info) -{ - FIXME("%p %ld %p\n", devinfo, index, info); - - if(info==NULL) - return FALSE; - if(info->cbSize < sizeof(*info)) - return FALSE; - - return FALSE; -} - -/*********************************************************************** - * SetupDiEnumDeviceInterfaces (SETUPAPI.@) - */ -BOOL WINAPI SetupDiEnumDeviceInterfaces( - HDEVINFO DeviceInfoSet, - PSP_DEVINFO_DATA DeviceInfoData, - CONST GUID * InterfaceClassGuid, - DWORD MemberIndex, - PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData) -{ - FIXME("\n"); - return FALSE; -} - -/*********************************************************************** - * SetupDiGetActualSectionToInstallA (SETUPAPI.@) - */ -BOOL WINAPI SetupDiGetActualSectionToInstallA( - HINF InfHandle, - PCSTR InfSectionName, - PSTR InfSectionWithExt, - DWORD InfSectionWithExtSize, - PDWORD RequiredSize, - PSTR *Extension) -{ - FIXME("\n"); - return FALSE; -} - -/*********************************************************************** - * SetupDiGetActualSectionToInstallW (SETUPAPI.@) - */ -BOOL WINAPI SetupDiGetActualSectionToInstallW( - HINF InfHandle, - PCWSTR InfSectionName, - PWSTR InfSectionWithExt, - DWORD InfSectionWithExtSize, - PDWORD RequiredSize, - PWSTR *Extension) -{ - WCHAR szBuffer[MAX_PATH]; - OSVERSIONINFO OsVersionInfo; - DWORD dwLength; - DWORD dwFullLength; - LONG lLineCount = -1; - - OsVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); - if (!GetVersionEx(&OsVersionInfo)) - { - return FALSE; - } - - lstrcpyW(szBuffer, InfSectionName); - dwLength = lstrlenW(szBuffer); - - if (OsVersionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT) - { - /* Test section name with '.NTx86' extension */ - lstrcpyW(&szBuffer[dwLength], NtPlatformExtension); - lLineCount = SetupGetLineCountW(InfHandle, szBuffer); - - if (lLineCount == -1) - { - /* Test section name with '.NT' extension */ - lstrcpyW(&szBuffer[dwLength], NtExtension); - lLineCount = SetupGetLineCountW(InfHandle, szBuffer); - } - } - else - { - /* Test section name with '.Win' extension */ - lstrcpyW(&szBuffer[dwLength], WinExtension); - lLineCount = SetupGetLineCountW(InfHandle, szBuffer); - } - - if (lLineCount == -1) - { - /* Test section name without extension */ - szBuffer[dwLength] = 0; - lLineCount = SetupGetLineCountW(InfHandle, szBuffer); - } - - if (lLineCount == -1) - { - SetLastError(ERROR_INVALID_PARAMETER); - return FALSE; - } - - dwFullLength = lstrlenW(szBuffer); - - if (InfSectionWithExt != NULL && InfSectionWithExtSize != 0) - { - if (InfSectionWithExtSize < (dwFullLength + 1)) - { - SetLastError(ERROR_INSUFFICIENT_BUFFER); - return FALSE; - } - - lstrcpyW(InfSectionWithExt, szBuffer); - if (Extension != NULL) - { - *Extension = (dwLength == dwFullLength) ? NULL : &InfSectionWithExt[dwLength]; - } - } - - if (RequiredSize != NULL) - { - *RequiredSize = dwFullLength + 1; - } - - return TRUE; -} - -/*********************************************************************** - * SetupDiGetClassDescriptionA (SETUPAPI.@) - */ -BOOL WINAPI SetupDiGetClassDescriptionA( - const GUID* ClassGuid, - PSTR ClassDescription, - DWORD ClassDescriptionSize, - PDWORD RequiredSize) -{ - return SetupDiGetClassDescriptionExA(ClassGuid, ClassDescription, - ClassDescriptionSize, - RequiredSize, NULL, NULL); -} - -/*********************************************************************** - * SetupDiGetClassDescriptionW (SETUPAPI.@) - */ -BOOL WINAPI SetupDiGetClassDescriptionW( - const GUID* ClassGuid, - PWSTR ClassDescription, - DWORD ClassDescriptionSize, - PDWORD RequiredSize) -{ - return SetupDiGetClassDescriptionExW(ClassGuid, ClassDescription, - ClassDescriptionSize, - RequiredSize, NULL, NULL); -} - -/*********************************************************************** - * SetupDiGetClassDescriptionExA (SETUPAPI.@) - */ -BOOL WINAPI SetupDiGetClassDescriptionExA( - const GUID* ClassGuid, - PSTR ClassDescription, - DWORD ClassDescriptionSize, - PDWORD RequiredSize, - PCSTR MachineName, - PVOID Reserved) -{ - FIXME("\n"); - return FALSE; -} - -/*********************************************************************** - * SetupDiGetClassDescriptionExW (SETUPAPI.@) - */ -BOOL WINAPI SetupDiGetClassDescriptionExW( - const GUID* ClassGuid, - PWSTR ClassDescription, - DWORD ClassDescriptionSize, - PDWORD RequiredSize, - PCWSTR MachineName, - PVOID Reserved) -{ - HKEY hKey; - DWORD dwLength; - - hKey = SetupDiOpenClassRegKeyExW(ClassGuid, - KEY_ALL_ACCESS, - DIOCR_INSTALLER, - MachineName, - Reserved); - if (hKey == INVALID_HANDLE_VALUE) - { - ERR("SetupDiOpenClassRegKeyExW() failed (Error %lu)\n", GetLastError()); - return FALSE; - } - - if (RequiredSize != NULL) - { - dwLength = 0; - if (RegQueryValueExW(hKey, - NULL, - NULL, - NULL, - NULL, - &dwLength)) - { - RegCloseKey(hKey); - return FALSE; - } - - *RequiredSize = dwLength / sizeof(WCHAR); - } - - dwLength = ClassDescriptionSize * sizeof(WCHAR); - if (RegQueryValueExW(hKey, - NULL, - NULL, - NULL, - (LPBYTE)ClassDescription, - &dwLength)) - { - RegCloseKey(hKey); - return FALSE; - } - - RegCloseKey(hKey); - - return TRUE; -} - -/*********************************************************************** - * SetupDiGetClassDevsA (SETUPAPI.@) - */ -HDEVINFO WINAPI SetupDiGetClassDevsA( - CONST GUID *class, - LPCSTR enumstr, - HWND parent, - DWORD flags) -{ - FIXME("%s %s %p %08lx\n",debugstr_guid(class),enumstr,parent,flags); - - return (HDEVINFO) INVALID_HANDLE_VALUE; -} - -/*********************************************************************** - * SetupDiGetClassDevsW (SETUPAPI.@) - */ -HDEVINFO WINAPI SetupDiGetClassDevsW( - CONST GUID *class, - LPCWSTR enumstr, - HWND parent, - DWORD flags) -{ - FIXME("%s %s %p %08lx\n",debugstr_guid(class),debugstr_w(enumstr),parent,flags); - - return (HDEVINFO) INVALID_HANDLE_VALUE; -} - -/*********************************************************************** - * SetupDiGetDeviceInterfaceDetailA (SETUPAPI.@) - */ -BOOL WINAPI SetupDiGetDeviceInterfaceDetailA( - HDEVINFO DeviceInfoSet, - PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData, - PSP_DEVICE_INTERFACE_DETAIL_DATA_A DeviceInterfaceDetailData, - DWORD DeviceInterfaceDetailDataSize, - PDWORD RequiredSize, - PSP_DEVINFO_DATA DeviceInfoData) -{ - FIXME("\n"); - return FALSE; -} - -/*********************************************************************** - * SetupDiGetDeviceInterfaceDetailW (SETUPAPI.@) - */ -BOOL WINAPI SetupDiGetDeviceInterfaceDetailW( - HDEVINFO DeviceInfoSet, - PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData, - PSP_DEVICE_INTERFACE_DETAIL_DATA_W DeviceInterfaceDetailData, - DWORD DeviceInterfaceDetailDataSize, - PDWORD RequiredSize, - PSP_DEVINFO_DATA DeviceInfoData) -{ - FIXME("\n"); - return FALSE; -} - -/*********************************************************************** - * SetupDiGetDeviceRegistryPropertyA (SETUPAPI.@) - */ -BOOL WINAPI SetupDiGetDeviceRegistryPropertyA( - HDEVINFO devinfo, - PSP_DEVINFO_DATA DeviceInfoData, - DWORD Property, - PDWORD PropertyRegDataType, - PBYTE PropertyBuffer, - DWORD PropertyBufferSize, - PDWORD RequiredSize) -{ - FIXME("%04lx %p %ld %p %p %ld %p\n", (DWORD)devinfo, DeviceInfoData, - Property, PropertyRegDataType, PropertyBuffer, PropertyBufferSize, - RequiredSize); - return FALSE; -} - -/*********************************************************************** - * SetupDiInstallClassA (SETUPAPI.@) - */ -BOOL WINAPI SetupDiInstallClassA( - HWND hwndParent, - PCSTR InfFileName, - DWORD Flags, - HSPFILEQ FileQueue) -{ - UNICODE_STRING FileNameW; - BOOL Result; - - if (!RtlCreateUnicodeStringFromAsciiz(&FileNameW, InfFileName)) - { - SetLastError(ERROR_NOT_ENOUGH_MEMORY); - return FALSE; - } - - Result = SetupDiInstallClassW(hwndParent, FileNameW.Buffer, Flags, FileQueue); - - RtlFreeUnicodeString(&FileNameW); - - return Result; -} - -static HKEY CreateClassKey(HINF hInf) -{ - WCHAR FullBuffer[MAX_PATH]; - WCHAR Buffer[MAX_PATH]; - DWORD RequiredSize; - HKEY hClassKey; - - if (!SetupGetLineTextW(NULL, - hInf, - L"Version", - L"ClassGUID", - Buffer, - MAX_PATH, - &RequiredSize)) - { - return INVALID_HANDLE_VALUE; - } - - lstrcpyW(FullBuffer, L"System\\CurrentControlSet\\Control\\Class\\"); - lstrcatW(FullBuffer, Buffer); - - if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, - FullBuffer, - 0, - KEY_ALL_ACCESS, - &hClassKey)) - { - if (!SetupGetLineTextW(NULL, - hInf, - L"Version", - L"Class", - Buffer, - MAX_PATH, - &RequiredSize)) - { - return INVALID_HANDLE_VALUE; - } - - if (RegCreateKeyExW(HKEY_LOCAL_MACHINE, - FullBuffer, - 0, - NULL, - REG_OPTION_NON_VOLATILE, - KEY_ALL_ACCESS, - NULL, - &hClassKey, - NULL)) - { - return INVALID_HANDLE_VALUE; - } - - } - - if (RegSetValueExW(hClassKey, - L"Class", - 0, - REG_SZ, - (LPBYTE)Buffer, - RequiredSize * sizeof(WCHAR))) - { - RegCloseKey(hClassKey); - RegDeleteKeyW(HKEY_LOCAL_MACHINE, - FullBuffer); - return INVALID_HANDLE_VALUE; - } - - return hClassKey; -} - -/*********************************************************************** - * SetupDiInstallClassW (SETUPAPI.@) - */ -BOOL WINAPI SetupDiInstallClassW( - HWND hwndParent, - PCWSTR InfFileName, - DWORD Flags, - HSPFILEQ FileQueue) -{ - WCHAR SectionName[MAX_PATH]; - DWORD SectionNameLength = 0; - HINF hInf; - BOOL bFileQueueCreated = FALSE; - HKEY hClassKey; - - - FIXME("Incomplete function.\n"); - - if ((Flags & DI_NOVCP) && (FileQueue == NULL || FileQueue == INVALID_HANDLE_VALUE)) - { - SetLastError(ERROR_INVALID_PARAMETER); - return FALSE; - } - - /* Open the .inf file */ - hInf = SetupOpenInfFileW(InfFileName, - NULL, - INF_STYLE_WIN4, - NULL); - if (hInf == INVALID_HANDLE_VALUE) - { - - return FALSE; - } - - /* Create or open the class registry key 'HKLM\\CurrentControlSet\\Class\\{GUID}' */ - hClassKey = CreateClassKey(hInf); - if (hClassKey == INVALID_HANDLE_VALUE) - { - SetupCloseInfFile(hInf); - return FALSE; - } - - - /* Try to append a layout file */ -#if 0 - SetupOpenAppendInfFileW(NULL, hInf, NULL); -#endif - - /* Retrieve the actual section name */ - SetupDiGetActualSectionToInstallW(hInf, - ClassInstall32, - SectionName, - MAX_PATH, - &SectionNameLength, - NULL); - -#if 0 - if (!(Flags & DI_NOVCP)) - { - FileQueue = SetupOpenFileQueue(); - if (FileQueue == INVALID_HANDLE_VALUE) - { - SetupCloseInfFile(hInf); - return FALSE; - } - - bFileQueueCreated = TRUE; - - } -#endif - - SetupInstallFromInfSectionW(NULL, - hInf, - SectionName, - SPINST_REGISTRY, - hClassKey, - NULL, - 0, - NULL, - NULL, - INVALID_HANDLE_VALUE, - NULL); - - /* FIXME: More code! */ - -ByeBye: - if (bFileQueueCreated) - SetupCloseFileQueue(FileQueue); - - SetupCloseInfFile(hInf); - - return TRUE; -} - - -/*********************************************************************** - * SetupDiOpenClassRegKey (SETUPAPI.@) - */ -HKEY WINAPI SetupDiOpenClassRegKey( - const GUID* ClassGuid, - REGSAM samDesired) -{ - return SetupDiOpenClassRegKeyExW(ClassGuid, samDesired, - DIOCR_INSTALLER, NULL, NULL); -} - - -/*********************************************************************** - * SetupDiOpenClassRegKeyExA (SETUPAPI.@) - */ -HKEY WINAPI SetupDiOpenClassRegKeyExA( - const GUID* ClassGuid, - REGSAM samDesired, - DWORD Flags, - PCSTR MachineName, - PVOID Reserved) -{ - FIXME("\n"); - return INVALID_HANDLE_VALUE; -} - - -/*********************************************************************** - * SetupDiOpenClassRegKeyExW (SETUPAPI.@) - */ -HKEY WINAPI SetupDiOpenClassRegKeyExW( - const GUID* ClassGuid, - REGSAM samDesired, - DWORD Flags, - PCWSTR MachineName, - PVOID Reserved) -{ - LPWSTR lpGuidString; - HKEY hClassesKey; - HKEY hClassKey; - LPWSTR lpKeyName; - - if (MachineName != NULL) - { - FIXME("Remote access not supported yet!\n"); - return INVALID_HANDLE_VALUE; - } - - if (Flags == DIOCR_INSTALLER) - { - lpKeyName = L"SYSTEM\\CurrentControlSet\\Control\\Class"; - } - else if (Flags == DIOCR_INTERFACE) - { - lpKeyName = L"SYSTEM\\CurrentControlSet\\Control\\DeviceClasses"; - } - else - { - ERR("Invalid Flags parameter!\n"); - SetLastError(ERROR_INVALID_PARAMETER); - return INVALID_HANDLE_VALUE; - } - - if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, - lpKeyName, - 0, - KEY_ALL_ACCESS, - &hClassesKey)) - { - return INVALID_HANDLE_VALUE; - } - - if (ClassGuid == NULL) - return hClassesKey; - - if (UuidToStringW((UUID*)ClassGuid, &lpGuidString) != RPC_S_OK) - { - RegCloseKey(hClassesKey); - return FALSE; - } - - if (RegOpenKeyExW(hClassesKey, - lpGuidString, - 0, - KEY_ALL_ACCESS, - &hClassKey)) - { - RpcStringFreeW(&lpGuidString); - RegCloseKey(hClassesKey); - return FALSE; - } - - RpcStringFreeW(&lpGuidString); - RegCloseKey(hClassesKey); - - return hClassKey; -} diff --git a/reactos/lib/setupapi/devinst16.c b/reactos/lib/setupapi/devinst16.c deleted file mode 100644 index 54e5e10c5b1..00000000000 --- a/reactos/lib/setupapi/devinst16.c +++ /dev/null @@ -1,134 +0,0 @@ -/* - * SetupAPI device installer - * - * Copyright 2000 Andreas Mohr for CodeWeavers - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include - -#include "windef.h" -#include "winbase.h" -#include "setupx16.h" -#include "wine/debug.h" - -WINE_DEFAULT_DEBUG_CHANNEL(setupapi); - -/*********************************************************************** - * DiGetClassDevs (SETUPX.304) - * Return a list of installed system devices. - * Uses HKLM\\ENUM to list devices. - */ -RETERR16 WINAPI DiGetClassDevs16(LPLPDEVICE_INFO16 lplpdi, - LPCSTR lpszClassName, HWND16 hwndParent, INT16 iFlags) -{ - LPDEVICE_INFO16 lpdi; - - FIXME("(%p, '%s', %04x, %04x), semi-stub.\n", - lplpdi, lpszClassName, hwndParent, iFlags); - lpdi = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(DEVICE_INFO16)); - lpdi->cbSize = sizeof(DEVICE_INFO16); - *lplpdi = (LPDEVICE_INFO16)MapLS(lpdi); - return OK; -} - -/*********************************************************************** - * DiBuildCompatDrvList (SETUPX.300) - */ -RETERR16 WINAPI DiBuildCompatDrvList16(LPDEVICE_INFO16 lpdi) -{ - FIXME("(%p): stub\n", lpdi); - lpdi->lpCompatDrvList = NULL; - return FALSE; -} - -/*********************************************************************** - * DiBuildClassDrvList (SETUPX.301) - */ -RETERR16 WINAPI DiBuildClassDrvList16(LPDEVICE_INFO16 lpdi) -{ - FIXME("(%p): stub\n", lpdi); - lpdi->lpCompatDrvList = NULL; - return FALSE; -} - -/*********************************************************************** - * DiCallClassInstaller (SETUPX.308) - */ -RETERR16 WINAPI DiCallClassInstaller16(/*DI_FUNCTIONS*/WORD diFctn, LPDEVICE_INFO16 lpdi) -{ - FIXME("(%x, %p): stub\n", diFctn, lpdi); - return FALSE; -} - -/*********************************************************************** - * DiCreateDevRegKey (SETUPX.318) - */ -RETERR16 WINAPI DiCreateDevRegKey16(LPDEVICE_INFO16 lpdi, - VOID* p2, WORD w3, - LPCSTR s4, WORD w5) -{ - FIXME("(%p, %p, %x, %s, %x): stub\n", lpdi, p2, w3, debugstr_a(s4), w5); - return FALSE; -} - -/*********************************************************************** - * DiDeleteDevRegKey (SETUPX.344) - */ -RETERR16 WINAPI DiDeleteDevRegKey16(LPDEVICE_INFO16 lpdi, INT16 iFlags) -{ - FIXME("(%p, %x): stub\n", lpdi, iFlags); - return FALSE; -} - -/*********************************************************************** - * DiCreateDeviceInfo (SETUPX.303) - */ -RETERR16 WINAPI DiCreateDeviceInfo16(LPLPDEVICE_INFO16 lplpdi, - LPCSTR lpszDescription, DWORD dnDevnode, - HKEY16 hkey, LPCSTR lpszRegsubkey, - LPCSTR lpszClassName, HWND16 hwndParent) -{ - LPDEVICE_INFO16 lpdi; - FIXME("(%p %s %08lx %x %s %s %x): stub\n", lplpdi, - debugstr_a(lpszDescription), dnDevnode, hkey, - debugstr_a(lpszRegsubkey), debugstr_a(lpszClassName), hwndParent); - lpdi = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(DEVICE_INFO16)); - lpdi->cbSize = sizeof(DEVICE_INFO16); - strcpy(lpdi->szClassName, lpszClassName); - lpdi->hwndParent = hwndParent; - *lplpdi = (LPDEVICE_INFO16)MapLS(lpdi); - return OK; -} - -/*********************************************************************** - * DiDestroyDeviceInfoList (SETUPX.305) - */ -RETERR16 WINAPI DiDestroyDeviceInfoList16(LPDEVICE_INFO16 lpdi) -{ - FIXME("(%p): stub\n", lpdi); - return FALSE; -} - -/*********************************************************************** - * DiOpenDevRegKey (SETUPX.319) - */ -RETERR16 WINAPI DiOpenDevRegKey16(LPDEVICE_INFO16 lpdi, - LPHKEY16 lphk,INT16 iFlags) -{ - FIXME("(%p %p %d): stub\n", lpdi, lphk, iFlags); - return FALSE; -} diff --git a/reactos/lib/setupapi/dirid.c b/reactos/lib/setupapi/dirid.c deleted file mode 100644 index 63f2e86377b..00000000000 --- a/reactos/lib/setupapi/dirid.c +++ /dev/null @@ -1,257 +0,0 @@ -/* - * Directory id handling - * - * Copyright 2002 Alexandre Julliard for CodeWeavers - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include - -#include "windef.h" -#include "winbase.h" -#include "winreg.h" -#include "winternl.h" -#include "winerror.h" -#include "wingdi.h" -#include "winuser.h" -#include "winnls.h" -#include "setupapi.h" -#include "wine/unicode.h" -#include "setupapi_private.h" -#include "wine/debug.h" - -WINE_DEFAULT_DEBUG_CHANNEL(setupapi); - -#define MAX_SYSTEM_DIRID DIRID_PRINTPROCESSOR - -struct user_dirid -{ - int id; - WCHAR *str; -}; - -static int nb_user_dirids; /* number of user dirids in use */ -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]; - -/* retrieve the string for unknown dirids */ -static const WCHAR *get_unknown_dirid(void) -{ - static WCHAR *unknown_dirid; - static const WCHAR unknown_str[] = {'\\','u','n','k','n','o','w','n',0}; - - if (!unknown_dirid) - { - UINT len = GetSystemDirectoryW( NULL, 0 ) + strlenW(unknown_str); - if (!(unknown_dirid = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) ))) return NULL; - GetSystemDirectoryW( unknown_dirid, len ); - strcatW( unknown_dirid, unknown_str ); - } - return unknown_dirid; -} - -/* create the string for a system dirid */ -static const WCHAR *create_system_dirid( int dirid ) -{ - static const WCHAR Null[] = {0}; - static const WCHAR C_Root[] = {'C',':','\\',0}; - static const WCHAR Drivers[] = {'\\','d','r','i','v','e','r','s',0}; - static const WCHAR Inf[] = {'\\','i','n','f',0}; - static const WCHAR Help[] = {'\\','h','e','l','p',0}; - static const WCHAR Fonts[] = {'\\','f','o','n','t','s',0}; - 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}; - - WCHAR buffer[MAX_PATH+16], *str; - int len; - - switch(dirid) - { - case DIRID_NULL: - return Null; - case DIRID_WINDOWS: - GetWindowsDirectoryW( buffer, MAX_PATH ); - break; - case DIRID_SYSTEM: - GetSystemDirectoryW( buffer, MAX_PATH ); - break; - case DIRID_DRIVERS: - GetSystemDirectoryW( buffer, MAX_PATH ); - strcatW( buffer, Drivers ); - break; - case DIRID_INF: - GetWindowsDirectoryW( buffer, MAX_PATH ); - strcatW( buffer, Inf ); - break; - case DIRID_HELP: - GetWindowsDirectoryW( buffer, MAX_PATH ); - strcatW( buffer, Help ); - break; - case DIRID_FONTS: - GetWindowsDirectoryW( buffer, MAX_PATH ); - strcatW( buffer, Fonts ); - break; - case DIRID_VIEWERS: - GetSystemDirectoryW( buffer, MAX_PATH ); - strcatW( buffer, Viewers ); - break; - case DIRID_APPS: - return C_Root; /* FIXME */ - case DIRID_SHARED: - GetWindowsDirectoryW( buffer, MAX_PATH ); - break; - case DIRID_BOOT: - return C_Root; /* FIXME */ - case DIRID_SYSTEM16: - GetWindowsDirectoryW( buffer, MAX_PATH ); - strcatW( buffer, System ); - break; - case DIRID_SPOOL: - case DIRID_SPOOLDRIVERS: /* FIXME */ - GetWindowsDirectoryW( buffer, MAX_PATH ); - strcatW( buffer, Spool ); - break; - case DIRID_LOADER: - return C_Root; /* FIXME */ - case DIRID_USERPROFILE: /* FIXME */ - case DIRID_COLOR: /* FIXME */ - case DIRID_PRINTPROCESSOR: /* FIXME */ - default: - FIXME( "unknown dirid %d\n", dirid ); - 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 ) -{ - int i; - - if (dirid == DIRID_ABSOLUTE || dirid == DIRID_ABSOLUTE_16BIT) dirid = DIRID_NULL; - - if (dirid >= DIRID_USER) - { - for (i = 0; i < nb_user_dirids; i++) - if (user_dirids[i].id == dirid) return user_dirids[i].str; - ERR("user id %d not found\n", dirid ); - return NULL; - } - else - { - if (dirid > MAX_SYSTEM_DIRID) return get_unknown_dirid(); - if (dirid == DIRID_SRCPATH) return PARSER_get_src_root( hinf ); - if (!system_dirids[dirid]) system_dirids[dirid] = create_system_dirid( dirid ); - return system_dirids[dirid]; - } -} - -/* store a user dirid string */ -static BOOL store_user_dirid( HINF hinf, int id, WCHAR *str ) -{ - int i; - - for (i = 0; i < nb_user_dirids; i++) if (user_dirids[i].id == id) break; - - if (i < nb_user_dirids) HeapFree( GetProcessHeap(), 0, user_dirids[i].str ); - else - { - if (nb_user_dirids >= alloc_user_dirids) - { - int new_size = max( 32, alloc_user_dirids * 2 ); - - struct user_dirid *new; - - if (user_dirids) - new = HeapReAlloc( GetProcessHeap(), 0, user_dirids, - new_size * sizeof(*new) ); - else - new = HeapAlloc( GetProcessHeap(), 0, - new_size * sizeof(*new) ); - - if (!new) return FALSE; - user_dirids = new; - alloc_user_dirids = new_size; - } - nb_user_dirids++; - } - user_dirids[i].id = id; - user_dirids[i].str = str; - TRACE("id %d -> %s\n", id, debugstr_w(str) ); - return TRUE; -} - - -/*********************************************************************** - * SetupSetDirectoryIdA (SETUPAPI.@) - */ -BOOL WINAPI SetupSetDirectoryIdA( HINF hinf, DWORD id, PCSTR dir ) -{ - UNICODE_STRING dirW; - int i; - - if (!id) /* clear everything */ - { - for (i = 0; i < nb_user_dirids; i++) HeapFree( GetProcessHeap(), 0, user_dirids[i].str ); - nb_user_dirids = 0; - return TRUE; - } - if (id < DIRID_USER) - { - SetLastError( ERROR_INVALID_PARAMETER ); - return FALSE; - } - - /* duplicate the string */ - if (!RtlCreateUnicodeStringFromAsciiz( &dirW, dir )) - { - SetLastError( ERROR_NOT_ENOUGH_MEMORY ); - return FALSE; - } - return store_user_dirid( hinf, id, dirW.Buffer ); -} - - -/*********************************************************************** - * SetupSetDirectoryIdW (SETUPAPI.@) - */ -BOOL WINAPI SetupSetDirectoryIdW( HINF hinf, DWORD id, PCWSTR dir ) -{ - int i, len; - WCHAR *str; - - if (!id) /* clear everything */ - { - for (i = 0; i < nb_user_dirids; i++) HeapFree( GetProcessHeap(), 0, user_dirids[i].str ); - nb_user_dirids = 0; - return TRUE; - } - if (id < DIRID_USER) - { - SetLastError( ERROR_INVALID_PARAMETER ); - return FALSE; - } - - /* duplicate the string */ - len = (strlenW(dir)+1) * sizeof(WCHAR); - if (!(str = HeapAlloc( GetProcessHeap(), 0, len ))) return FALSE; - memcpy( str, dir, len ); - return store_user_dirid( hinf, id, str ); -} diff --git a/reactos/lib/setupapi/diskspace.c b/reactos/lib/setupapi/diskspace.c deleted file mode 100644 index c851d61c93c..00000000000 --- a/reactos/lib/setupapi/diskspace.c +++ /dev/null @@ -1,156 +0,0 @@ -/* - * SetupAPI DiskSpace functions - * - * Copyright 2004 CodeWeavers (Aric Stewart) - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include "config.h" -#include "wine/port.h" - -#include - -#include "windef.h" -#include "winbase.h" -#include "wingdi.h" -#include "winuser.h" -#include "winnls.h" -#include "winreg.h" -#include "setupapi.h" -#include "wine/debug.h" - -WINE_DEFAULT_DEBUG_CHANNEL(setupapi); - -typedef struct { - WCHAR lpzName[20]; - LONGLONG dwFreeSpace; - LONGLONG dwWantedSpace; -} DRIVE_ENTRY, *LPDRIVE_ENTRY; - -typedef struct { - DWORD dwDriveCount; - DRIVE_ENTRY Drives[26]; -} DISKSPACELIST, *LPDISKSPACELIST; - - -/*********************************************************************** - * SetupCreateDiskSpaceListW (SETUPAPI.@) - */ -HDSKSPC WINAPI SetupCreateDiskSpaceListW(PVOID Reserved1, DWORD Reserved2, UINT Flags) -{ - WCHAR drives[255]; - DWORD rc; - WCHAR *ptr; - LPDISKSPACELIST list=NULL; - - rc = GetLogicalDriveStringsW(255,drives); - - if (rc == 0) - return NULL; - - list = (LPDISKSPACELIST)HeapAlloc(GetProcessHeap(),0,sizeof(DISKSPACELIST)); - - list->dwDriveCount = 0; - - ptr = drives; - - while (*ptr) - { - DWORD type = GetDriveTypeW(ptr); - DWORD len; - if (type == DRIVE_FIXED) - { - DWORD clusters; - DWORD sectors; - DWORD bytes; - DWORD total; - lstrcpyW(list->Drives[list->dwDriveCount].lpzName,ptr); - GetDiskFreeSpaceW(ptr,§ors,&bytes,&clusters,&total); - list->Drives[list->dwDriveCount].dwFreeSpace = clusters * sectors * - bytes; - list->Drives[list->dwDriveCount].dwWantedSpace = 0; - list->dwDriveCount++; - } - len = lstrlenW(ptr); - len++; - ptr+=sizeof(WCHAR)*len; - } - return (HANDLE)list; -} - - -/*********************************************************************** - * SetupCreateDiskSpaceListA (SETUPAPI.@) - */ -HDSKSPC WINAPI SetupCreateDiskSpaceListA(PVOID Reserved1, DWORD Reserved2, UINT Flags) -{ - return SetupCreateDiskSpaceListW( Reserved1, Reserved2, Flags ); -} - - -/*********************************************************************** - * SetupAddInstallSectionToDiskSpaceListA (SETUPAPI.@) - */ -BOOL WINAPI SetupAddInstallSectionToDiskSpaceListA(HDSKSPC DiskSpace, - HINF InfHandle, HINF LayoutInfHandle, - LPSTR SectionName, PVOID Reserved1, UINT Reserved2) -{ - FIXME ("Stub\n"); - return TRUE; -} - -/*********************************************************************** -* SetupQuerySpaceRequiredOnDriveA (SETUPAPI.@) -*/ -BOOL WINAPI SetupQuerySpaceRequiredOnDriveA(HDSKSPC DiskSpace, - LPSTR DriveSpec, LONGLONG* SpaceRequired, - PVOID Reserved1, UINT Reserved2) -{ - WCHAR driveW[20]; - int i; - LPDISKSPACELIST list = (LPDISKSPACELIST)DiskSpace; - BOOL rc = FALSE; - WCHAR bkslsh[]= {'\\',0}; - - MultiByteToWideChar(CP_ACP,0,DriveSpec,-1,driveW,20); - - lstrcatW(driveW,bkslsh); - - TRACE("Looking for drive %s\n",debugstr_w(driveW)); - - for (i = 0; i < list->dwDriveCount; i++) - { - TRACE("checking drive %s\n",debugstr_w(list->Drives[i].lpzName)); - if (lstrcmpW(driveW,list->Drives[i].lpzName)==0) - { - rc = TRUE; - *SpaceRequired = list->Drives[i].dwWantedSpace; - break; - } - } - - return rc; -} - -/*********************************************************************** -* SetupDestroyDiskSpaceList (SETUPAPI.@) -*/ -BOOL WINAPI SetupDestroyDiskSpaceList(HDSKSPC DiskSpace) -{ - LPDISKSPACELIST list = (LPDISKSPACELIST)DiskSpace; - HeapFree(GetProcessHeap(),0,list); - return TRUE; -} diff --git a/reactos/lib/setupapi/infparse.c b/reactos/lib/setupapi/infparse.c deleted file mode 100644 index c508db613ae..00000000000 --- a/reactos/lib/setupapi/infparse.c +++ /dev/null @@ -1,198 +0,0 @@ -/* - * SetupX .inf file parsing functions - * - * Copyright 2000 Andreas Mohr for CodeWeavers - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * FIXME: - * - return values ??? - * - this should be reimplemented at some point to have its own - * file parsing instead of using profile functions, - * as some SETUPX exports probably demand that - * (IpSaveRestorePosition, IpFindNextMatchLine, ...). - */ - -#include -#include - -#include "windef.h" -#include "winbase.h" -#include "winreg.h" -#include "winternl.h" -#include "wingdi.h" -#include "winuser.h" -#include "winnls.h" -#include "setupapi.h" -#include "setupx16.h" -#include "setupapi_private.h" -#include "wine/debug.h" - -WINE_DEFAULT_DEBUG_CHANNEL(setupapi); - -#define MAX_HANDLES 16384 -#define FIRST_HANDLE 32 - -static HINF handles[MAX_HANDLES]; - - -static RETERR16 alloc_hinf16( HINF hinf, HINF16 *hinf16 ) -{ - int i; - for (i = 0; i < MAX_HANDLES; i++) - { - if (!handles[i]) - { - handles[i] = hinf; - *hinf16 = i + FIRST_HANDLE; - return OK; - } - } - return ERR_IP_OUT_OF_HANDLES; -} - -static HINF get_hinf( HINF16 hinf16 ) -{ - int idx = hinf16 - FIRST_HANDLE; - if (idx < 0 || idx >= MAX_HANDLES) return 0; - return handles[idx]; -} - - -static HINF free_hinf16( HINF16 hinf16 ) -{ - HINF ret; - int idx = hinf16 - FIRST_HANDLE; - - if (idx < 0 || idx >= MAX_HANDLES) return 0; - ret = handles[idx]; - handles[idx] = 0; - return ret; -} - -/* convert last error code to a RETERR16 value */ -static RETERR16 get_last_error(void) -{ - switch(GetLastError()) - { - case ERROR_EXPECTED_SECTION_NAME: - case ERROR_BAD_SECTION_NAME_LINE: - case ERROR_SECTION_NAME_TOO_LONG: return ERR_IP_INVALID_SECT_NAME; - case ERROR_SECTION_NOT_FOUND: return ERR_IP_SECT_NOT_FOUND; - case ERROR_LINE_NOT_FOUND: return ERR_IP_LINE_NOT_FOUND; - default: return IP_ERROR; /* FIXME */ - } -} - - -/*********************************************************************** - * IpOpen (SETUPX.2) - * - */ -RETERR16 WINAPI IpOpen16( LPCSTR filename, HINF16 *hinf16 ) -{ - HINF hinf = SetupOpenInfFileA( filename, NULL, INF_STYLE_WIN4, NULL ); - if (hinf == (HINF)INVALID_HANDLE_VALUE) return get_last_error(); - return alloc_hinf16( hinf, hinf16 ); -} - - -/*********************************************************************** - * IpClose (SETUPX.4) - */ -RETERR16 WINAPI IpClose16( HINF16 hinf16 ) -{ - HINF hinf = free_hinf16( hinf16 ); - if (!hinf) return ERR_IP_INVALID_HINF; - SetupCloseInfFile( hinf ); - return OK; -} - - -/*********************************************************************** - * IpGetProfileString (SETUPX.210) - */ -RETERR16 WINAPI IpGetProfileString16( HINF16 hinf16, LPCSTR section, LPCSTR entry, - LPSTR buffer, WORD buflen ) -{ - DWORD required_size; - HINF hinf = get_hinf( hinf16 ); - - if (!hinf) return ERR_IP_INVALID_HINF; - if (!SetupGetLineTextA( NULL, hinf, section, entry, buffer, buflen, &required_size )) - return get_last_error(); - TRACE("%p: section %s entry %s ret %s\n", - hinf, debugstr_a(section), debugstr_a(entry), debugstr_a(buffer) ); - return OK; -} - - -/*********************************************************************** - * GenFormStrWithoutPlaceHolders (SETUPX.103) - * - * ought to be pretty much implemented, I guess... - */ -void WINAPI GenFormStrWithoutPlaceHolders16( LPSTR dst, LPCSTR src, HINF16 hinf16 ) -{ - UNICODE_STRING srcW; - HINF hinf = get_hinf( hinf16 ); - - if (!hinf) return; - - if (!RtlCreateUnicodeStringFromAsciiz( &srcW, src )) return; - PARSER_string_substA( hinf, srcW.Buffer, dst, MAX_INF_STRING_LENGTH ); - RtlFreeUnicodeString( &srcW ); - TRACE( "%s -> %s\n", debugstr_a(src), debugstr_a(dst) ); -} - -/*********************************************************************** - * GenInstall (SETUPX.101) - * - * generic installer function for .INF file sections - * - * This is not perfect - patch whenever you can ! - * - * wFlags == GENINSTALL_DO_xxx - * e.g. NetMeeting: - * first call GENINSTALL_DO_REGSRCPATH | GENINSTALL_DO_FILES, - * second call GENINSTALL_DO_LOGCONFIG | CFGAUTO | INI2REG | REG | INI - */ -RETERR16 WINAPI GenInstall16( HINF16 hinf16, LPCSTR section, WORD genflags ) -{ - UINT flags = 0; - HINF hinf = get_hinf( hinf16 ); - RETERR16 ret = OK; - void *context; - - if (!hinf) return ERR_IP_INVALID_HINF; - - if (genflags & GENINSTALL_DO_FILES) flags |= SPINST_FILES; - if (genflags & GENINSTALL_DO_INI) flags |= SPINST_INIFILES; - if (genflags & GENINSTALL_DO_REG) flags |= SPINST_REGISTRY; - if (genflags & GENINSTALL_DO_INI2REG) flags |= SPINST_INI2REG; - if (genflags & GENINSTALL_DO_LOGCONFIG) flags |= SPINST_LOGCONFIG; - if (genflags & GENINSTALL_DO_REGSRCPATH) FIXME( "unsupported flag: GENINSTALL_DO_REGSRCPATH\n" ); - if (genflags & GENINSTALL_DO_CFGAUTO) FIXME( "unsupported flag: GENINSTALL_DO_CFGAUTO\n" ); - if (genflags & GENINSTALL_DO_PERUSER) FIXME( "unsupported flag: GENINSTALL_DO_PERUSER\n" ); - - context = SetupInitDefaultQueueCallback( 0 ); - if (!SetupInstallFromInfSectionA( 0, hinf, section, flags, 0, NULL, - SP_COPY_NEWER_OR_SAME, SetupDefaultQueueCallbackA, - context, 0, 0 )) - ret = get_last_error(); - - SetupTermDefaultQueueCallback( context ); - return ret; -} diff --git a/reactos/lib/setupapi/install.c b/reactos/lib/setupapi/install.c deleted file mode 100644 index eeedd91d77f..00000000000 --- a/reactos/lib/setupapi/install.c +++ /dev/null @@ -1,955 +0,0 @@ -/* - * Setupapi install routines - * - * Copyright 2002 Alexandre Julliard for CodeWeavers - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include - -#include "windef.h" -#include "winbase.h" -#include "winreg.h" -#include "winternl.h" -#include "winerror.h" -#include "wingdi.h" -#include "winuser.h" -#include "winnls.h" -#include "setupapi.h" -#include "setupapi_private.h" -#include "wine/unicode.h" -#include "wine/debug.h" - -WINE_DEFAULT_DEBUG_CHANNEL(setupapi); - -/* info passed to callback functions dealing with files */ -struct files_callback_info -{ - HSPFILEQ queue; - PCWSTR src_root; - UINT copy_flags; - HINF layout; -}; - -/* info passed to callback functions dealing with the registry */ -struct registry_callback_info -{ - HKEY default_root; - BOOL delete; -}; - -/* info passed to callback functions dealing with registering dlls */ -struct register_dll_info -{ - PSP_FILE_CALLBACK_W callback; - PVOID callback_context; - BOOL unregister; -}; - -typedef BOOL (*iterate_fields_func)( HINF hinf, PCWSTR field, void *arg ); - -/* Unicode constants */ -static const WCHAR CopyFiles[] = {'C','o','p','y','F','i','l','e','s',0}; -static const WCHAR DelFiles[] = {'D','e','l','F','i','l','e','s',0}; -static const WCHAR RenFiles[] = {'R','e','n','F','i','l','e','s',0}; -static const WCHAR Ini2Reg[] = {'I','n','i','2','R','e','g',0}; -static const WCHAR LogConf[] = {'L','o','g','C','o','n','f',0}; -static const WCHAR AddReg[] = {'A','d','d','R','e','g',0}; -static const WCHAR DelReg[] = {'D','e','l','R','e','g',0}; -static const WCHAR BitReg[] = {'B','i','t','R','e','g',0}; -static const WCHAR UpdateInis[] = {'U','p','d','a','t','e','I','n','i','s',0}; -static const WCHAR CopyINF[] = {'C','o','p','y','I','N','F',0}; -static const WCHAR UpdateIniFields[] = {'U','p','d','a','t','e','I','n','i','F','i','e','l','d','s',0}; -static const WCHAR RegisterDlls[] = {'R','e','g','i','s','t','e','r','D','l','l','s',0}; -static const WCHAR UnregisterDlls[] = {'U','n','r','e','g','i','s','t','e','r','D','l','l','s',0}; -static const WCHAR ProfileItems[] = {'P','r','o','f','i','l','e','I','t','e','m','s',0}; - - -/*********************************************************************** - * get_field_string - * - * Retrieve the contents of a field, dynamically growing the buffer if necessary. - */ -static WCHAR *get_field_string( INFCONTEXT *context, DWORD index, WCHAR *buffer, - WCHAR *static_buffer, DWORD *size ) -{ - DWORD required; - - if (SetupGetStringFieldW( context, index, buffer, *size, &required )) return buffer; - if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) - { - /* now grow the buffer */ - if (buffer != static_buffer) HeapFree( GetProcessHeap(), 0, buffer ); - if (!(buffer = HeapAlloc( GetProcessHeap(), 0, required*sizeof(WCHAR) ))) return NULL; - *size = required; - if (SetupGetStringFieldW( context, index, buffer, *size, &required )) return buffer; - } - if (buffer != static_buffer) HeapFree( GetProcessHeap(), 0, buffer ); - return NULL; -} - - -/*********************************************************************** - * copy_files_callback - * - * Called once for each CopyFiles entry in a given section. - */ -static BOOL copy_files_callback( HINF hinf, PCWSTR field, void *arg ) -{ - struct files_callback_info *info = arg; - - if (field[0] == '@') /* special case: copy single file */ - SetupQueueDefaultCopyW( info->queue, info->layout, info->src_root, NULL, field, info->copy_flags ); - else - SetupQueueCopySectionW( info->queue, info->src_root, info->layout, hinf, field, info->copy_flags ); - return TRUE; -} - - -/*********************************************************************** - * delete_files_callback - * - * Called once for each DelFiles entry in a given section. - */ -static BOOL delete_files_callback( HINF hinf, PCWSTR field, void *arg ) -{ - struct files_callback_info *info = arg; - SetupQueueDeleteSectionW( info->queue, hinf, 0, field ); - return TRUE; -} - - -/*********************************************************************** - * rename_files_callback - * - * Called once for each RenFiles entry in a given section. - */ -static BOOL rename_files_callback( HINF hinf, PCWSTR field, void *arg ) -{ - struct files_callback_info *info = arg; - SetupQueueRenameSectionW( info->queue, hinf, 0, field ); - return TRUE; -} - - -/*********************************************************************** - * get_root_key - * - * Retrieve the registry root key from its name. - */ -static HKEY get_root_key( const WCHAR *name, HKEY def_root ) -{ - static const WCHAR HKCR[] = {'H','K','C','R',0}; - static const WCHAR HKCU[] = {'H','K','C','U',0}; - static const WCHAR HKLM[] = {'H','K','L','M',0}; - static const WCHAR HKU[] = {'H','K','U',0}; - static const WCHAR HKR[] = {'H','K','R',0}; - - if (!strcmpiW( name, HKCR )) return HKEY_CLASSES_ROOT; - if (!strcmpiW( name, HKCU )) return HKEY_CURRENT_USER; - if (!strcmpiW( name, HKLM )) return HKEY_LOCAL_MACHINE; - if (!strcmpiW( name, HKU )) return HKEY_USERS; - if (!strcmpiW( name, HKR )) return def_root; - return 0; -} - - -/*********************************************************************** - * append_multi_sz_value - * - * Append a multisz string to a multisz registry value. - */ -static void append_multi_sz_value( HKEY hkey, const WCHAR *value, const WCHAR *strings, - DWORD str_size ) -{ - DWORD size, type, total; - WCHAR *buffer, *p; - - if (RegQueryValueExW( hkey, value, NULL, &type, NULL, &size )) return; - if (type != REG_MULTI_SZ) return; - - if (!(buffer = HeapAlloc( GetProcessHeap(), 0, (size + str_size) * sizeof(WCHAR) ))) return; - if (RegQueryValueExW( hkey, value, NULL, NULL, (BYTE *)buffer, &size )) goto done; - - /* compare each string against all the existing ones */ - total = size; - while (*strings) - { - int len = strlenW(strings) + 1; - - for (p = buffer; *p; p += strlenW(p) + 1) - if (!strcmpiW( p, strings )) break; - - if (!*p) /* not found, need to append it */ - { - memcpy( p, strings, len * sizeof(WCHAR) ); - p[len] = 0; - total += len; - } - strings += len; - } - if (total != size) - { - TRACE( "setting value %s to %s\n", debugstr_w(value), debugstr_w(buffer) ); - RegSetValueExW( hkey, value, 0, REG_MULTI_SZ, (BYTE *)buffer, total ); - } - done: - HeapFree( GetProcessHeap(), 0, buffer ); -} - - -/*********************************************************************** - * delete_multi_sz_value - * - * Remove a string from a multisz registry value. - */ -static void delete_multi_sz_value( HKEY hkey, const WCHAR *value, const WCHAR *string ) -{ - DWORD size, type; - WCHAR *buffer, *src, *dst; - - if (RegQueryValueExW( hkey, value, NULL, &type, NULL, &size )) return; - if (type != REG_MULTI_SZ) return; - /* allocate double the size, one for value before and one for after */ - if (!(buffer = HeapAlloc( GetProcessHeap(), 0, size * 2 * sizeof(WCHAR) ))) return; - if (RegQueryValueExW( hkey, value, NULL, NULL, (BYTE *)buffer, &size )) goto done; - src = buffer; - dst = buffer + size; - while (*src) - { - int len = strlenW(src) + 1; - if (strcmpiW( src, string )) - { - memcpy( dst, src, len * sizeof(WCHAR) ); - dst += len; - } - src += len; - } - *dst++ = 0; - if (dst != buffer + 2*size) /* did we remove something? */ - { - TRACE( "setting value %s to %s\n", debugstr_w(value), debugstr_w(buffer + size) ); - RegSetValueExW( hkey, value, 0, REG_MULTI_SZ, - (BYTE *)(buffer + size), dst - (buffer + size) ); - } - done: - HeapFree( GetProcessHeap(), 0, buffer ); -} - - -/*********************************************************************** - * do_reg_operation - * - * Perform an add/delete registry operation depending on the flags. - */ -static BOOL do_reg_operation( HKEY hkey, const WCHAR *value, INFCONTEXT *context, INT flags ) -{ - DWORD type, size; - - if (flags & (FLG_ADDREG_DELREG_BIT | FLG_ADDREG_DELVAL)) /* deletion */ - { - if (*value && !(flags & FLG_DELREG_KEYONLY_COMMON)) - { - if ((flags & FLG_DELREG_MULTI_SZ_DELSTRING) == FLG_DELREG_MULTI_SZ_DELSTRING) - { - WCHAR *str; - - if (!SetupGetStringFieldW( context, 5, NULL, 0, &size ) || !size) return TRUE; - if (!(str = HeapAlloc( GetProcessHeap(), 0, size * sizeof(WCHAR) ))) return FALSE; - SetupGetStringFieldW( context, 5, str, size, NULL ); - delete_multi_sz_value( hkey, value, str ); - HeapFree( GetProcessHeap(), 0, str ); - } - else RegDeleteValueW( hkey, value ); - } - else RegDeleteKeyW( hkey, NULL ); - return TRUE; - } - - if (flags & (FLG_ADDREG_KEYONLY|FLG_ADDREG_KEYONLY_COMMON)) return TRUE; - - if (flags & (FLG_ADDREG_NOCLOBBER|FLG_ADDREG_OVERWRITEONLY)) - { - BOOL exists = !RegQueryValueExW( hkey, value, NULL, NULL, NULL, NULL ); - if (exists && (flags & FLG_ADDREG_NOCLOBBER)) return TRUE; - if (!exists & (flags & FLG_ADDREG_OVERWRITEONLY)) return TRUE; - } - - switch(flags & FLG_ADDREG_TYPE_MASK) - { - case FLG_ADDREG_TYPE_SZ: type = REG_SZ; break; - case FLG_ADDREG_TYPE_MULTI_SZ: type = REG_MULTI_SZ; break; - case FLG_ADDREG_TYPE_EXPAND_SZ: type = REG_EXPAND_SZ; break; - case FLG_ADDREG_TYPE_BINARY: type = REG_BINARY; break; - case FLG_ADDREG_TYPE_DWORD: type = REG_DWORD; break; - case FLG_ADDREG_TYPE_NONE: type = REG_NONE; break; - default: type = flags >> 16; break; - } - - if (!(flags & FLG_ADDREG_BINVALUETYPE) || - (type == REG_DWORD && SetupGetFieldCount(context) == 5)) - { - static const WCHAR empty; - WCHAR *str = NULL; - - if (type == REG_MULTI_SZ) - { - if (!SetupGetMultiSzFieldW( context, 5, NULL, 0, &size )) size = 0; - if (size) - { - if (!(str = HeapAlloc( GetProcessHeap(), 0, size * sizeof(WCHAR) ))) return FALSE; - SetupGetMultiSzFieldW( context, 5, str, size, NULL ); - } - if (flags & FLG_ADDREG_APPEND) - { - if (!str) return TRUE; - append_multi_sz_value( hkey, value, str, size ); - HeapFree( GetProcessHeap(), 0, str ); - return TRUE; - } - /* else fall through to normal string handling */ - } - else - { - if (!SetupGetStringFieldW( context, 5, NULL, 0, &size )) size = 0; - if (size) - { - if (!(str = HeapAlloc( GetProcessHeap(), 0, size * sizeof(WCHAR) ))) return FALSE; - SetupGetStringFieldW( context, 5, str, size, NULL ); - } - } - - if (type == REG_DWORD) - { - DWORD dw = str ? strtoulW( str, NULL, 16 ) : 0; - TRACE( "setting dword %s to %lx\n", debugstr_w(value), dw ); - RegSetValueExW( hkey, value, 0, type, (BYTE *)&dw, sizeof(dw) ); - } - else - { - TRACE( "setting value %s to %s\n", debugstr_w(value), debugstr_w(str) ); - if (str) RegSetValueExW( hkey, value, 0, type, (BYTE *)str, size * sizeof(WCHAR) ); - else RegSetValueExW( hkey, value, 0, type, (BYTE *)&empty, sizeof(WCHAR) ); - } - HeapFree( GetProcessHeap(), 0, str ); - return TRUE; - } - else /* get the binary data */ - { - BYTE *data = NULL; - - if (!SetupGetBinaryField( context, 5, NULL, 0, &size )) size = 0; - if (size) - { - if (!(data = HeapAlloc( GetProcessHeap(), 0, size ))) return FALSE; - TRACE( "setting binary data %s len %ld\n", debugstr_w(value), size ); - SetupGetBinaryField( context, 5, data, size, NULL ); - } - RegSetValueExW( hkey, value, 0, type, data, size ); - HeapFree( GetProcessHeap(), 0, data ); - return TRUE; - } -} - - -/*********************************************************************** - * registry_callback - * - * Called once for each AddReg and DelReg entry in a given section. - */ -static BOOL registry_callback( HINF hinf, PCWSTR field, void *arg ) -{ - struct registry_callback_info *info = arg; - INFCONTEXT context; - HKEY root_key, hkey; - - BOOL ok = SetupFindFirstLineW( hinf, field, NULL, &context ); - - for (; ok; ok = SetupFindNextLine( &context, &context )) - { - WCHAR buffer[MAX_INF_STRING_LENGTH]; - INT flags; - - /* get root */ - if (!SetupGetStringFieldW( &context, 1, buffer, sizeof(buffer)/sizeof(WCHAR), NULL )) - continue; - if (!(root_key = get_root_key( buffer, info->default_root ))) - continue; - - /* get key */ - if (!SetupGetStringFieldW( &context, 2, buffer, sizeof(buffer)/sizeof(WCHAR), NULL )) - *buffer = 0; - - /* get flags */ - if (!SetupGetIntField( &context, 4, &flags )) flags = 0; - - if (!info->delete) - { - if (flags & FLG_ADDREG_DELREG_BIT) continue; /* ignore this entry */ - } - else - { - if (!flags) flags = FLG_ADDREG_DELREG_BIT; - else if (!(flags & FLG_ADDREG_DELREG_BIT)) continue; /* ignore this entry */ - } - - if (info->delete || (flags & FLG_ADDREG_OVERWRITEONLY)) - { - if (RegOpenKeyW( root_key, buffer, &hkey )) continue; /* ignore if it doesn't exist */ - } - else if (RegCreateKeyW( root_key, buffer, &hkey )) - { - ERR( "could not create key %p %s\n", root_key, debugstr_w(buffer) ); - continue; - } - TRACE( "key %p %s\n", root_key, debugstr_w(buffer) ); - - /* get value name */ - if (!SetupGetStringFieldW( &context, 3, buffer, sizeof(buffer)/sizeof(WCHAR), NULL )) - *buffer = 0; - - /* and now do it */ - if (!do_reg_operation( hkey, buffer, &context, flags )) - { - RegCloseKey( hkey ); - return FALSE; - } - RegCloseKey( hkey ); - } - return TRUE; -} - - -/*********************************************************************** - * do_register_dll - * - * Register or unregister a dll. - */ -static BOOL do_register_dll( const struct register_dll_info *info, const WCHAR *path, - INT flags, INT timeout, const WCHAR *args ) -{ - HMODULE module; - HRESULT res; - SP_REGISTER_CONTROL_STATUSW status; - - status.cbSize = sizeof(status); - status.FileName = path; - status.FailureCode = SPREG_SUCCESS; - status.Win32Error = ERROR_SUCCESS; - - if (info->callback) - { - switch(info->callback( info->callback_context, SPFILENOTIFY_STARTREGISTRATION, - (UINT_PTR)&status, !info->unregister )) - { - case FILEOP_ABORT: - SetLastError( ERROR_OPERATION_ABORTED ); - return FALSE; - case FILEOP_SKIP: - return TRUE; - case FILEOP_DOIT: - break; - } - } - - if (!(module = LoadLibraryExW( path, 0, LOAD_WITH_ALTERED_SEARCH_PATH ))) - { - WARN( "could not load %s\n", debugstr_w(path) ); - status.FailureCode = SPREG_LOADLIBRARY; - status.Win32Error = GetLastError(); - goto done; - } - - if (flags & FLG_REGSVR_DLLREGISTER) - { - const char *entry_point = info->unregister ? "DllUnregisterServer" : "DllRegisterServer"; - HRESULT (WINAPI *func)(void) = (void *)GetProcAddress( module, entry_point ); - - if (!func) - { - status.FailureCode = SPREG_GETPROCADDR; - status.Win32Error = GetLastError(); - goto done; - } - - TRACE( "calling %s in %s\n", entry_point, debugstr_w(path) ); - res = func(); - - if (FAILED(res)) - { - WARN( "calling %s in %s returned error %lx\n", entry_point, debugstr_w(path), res ); - status.FailureCode = SPREG_REGSVR; - status.Win32Error = res; - goto done; - } - } - - if (flags & FLG_REGSVR_DLLINSTALL) - { - HRESULT (WINAPI *func)(BOOL,LPCWSTR) = (void *)GetProcAddress( module, "DllInstall" ); - - if (!func) - { - status.FailureCode = SPREG_GETPROCADDR; - status.Win32Error = GetLastError(); - goto done; - } - - TRACE( "calling DllInstall(%d,%s) in %s\n", - !info->unregister, debugstr_w(args), debugstr_w(path) ); - res = func( !info->unregister, args ); - - if (FAILED(res)) - { - WARN( "calling DllInstall in %s returned error %lx\n", debugstr_w(path), res ); - status.FailureCode = SPREG_REGSVR; - status.Win32Error = res; - goto done; - } - } - -done: - if (module) FreeLibrary( module ); - if (info->callback) info->callback( info->callback_context, SPFILENOTIFY_ENDREGISTRATION, - (UINT_PTR)&status, !info->unregister ); - return TRUE; -} - - -/*********************************************************************** - * register_dlls_callback - * - * Called once for each RegisterDlls entry in a given section. - */ -static BOOL register_dlls_callback( HINF hinf, PCWSTR field, void *arg ) -{ - struct register_dll_info *info = arg; - INFCONTEXT context; - BOOL ret = TRUE; - BOOL ok = SetupFindFirstLineW( hinf, field, NULL, &context ); - - for (; ok; ok = SetupFindNextLine( &context, &context )) - { - WCHAR *path, *args, *p; - WCHAR buffer[MAX_INF_STRING_LENGTH]; - INT flags, timeout; - - /* get directory */ - if (!(path = PARSER_get_dest_dir( &context ))) continue; - - /* get dll name */ - if (!SetupGetStringFieldW( &context, 3, buffer, sizeof(buffer)/sizeof(WCHAR), NULL )) - goto done; - if (!(p = HeapReAlloc( GetProcessHeap(), 0, path, - (strlenW(path) + strlenW(buffer) + 2) * sizeof(WCHAR) ))) goto done; - path = p; - p += strlenW(p); - if (p == path || p[-1] != '\\') *p++ = '\\'; - strcpyW( p, buffer ); - - /* get flags */ - if (!SetupGetIntField( &context, 4, &flags )) flags = 0; - - /* get timeout */ - if (!SetupGetIntField( &context, 5, &timeout )) timeout = 60; - - /* get command line */ - args = NULL; - if (SetupGetStringFieldW( &context, 6, buffer, sizeof(buffer)/sizeof(WCHAR), NULL )) - args = buffer; - - ret = do_register_dll( info, path, flags, timeout, args ); - - done: - HeapFree( GetProcessHeap(), 0, path ); - if (!ret) break; - } - return ret; -} - -/*********************************************************************** - * update_ini_callback - * - * Called once for each UpdateInis entry in a given section. - */ -static BOOL update_ini_callback( HINF hinf, PCWSTR field, void *arg ) -{ - INFCONTEXT context; - - BOOL ok = SetupFindFirstLineW( hinf, field, NULL, &context ); - - for (; ok; ok = SetupFindNextLine( &context, &context )) - { - WCHAR buffer[MAX_INF_STRING_LENGTH]; - WCHAR filename[MAX_INF_STRING_LENGTH]; - WCHAR section[MAX_INF_STRING_LENGTH]; - WCHAR entry[MAX_INF_STRING_LENGTH]; - WCHAR string[MAX_INF_STRING_LENGTH]; - LPWSTR divider; - - if (!SetupGetStringFieldW( &context, 1, filename, - sizeof(filename)/sizeof(WCHAR), NULL )) - continue; - - if (!SetupGetStringFieldW( &context, 2, section, - sizeof(section)/sizeof(WCHAR), NULL )) - continue; - - if (!SetupGetStringFieldW( &context, 4, buffer, - sizeof(buffer)/sizeof(WCHAR), NULL )) - continue; - - divider = strchrW(buffer,'='); - if (divider) - { - *divider = 0; - strcpyW(entry,buffer); - divider++; - strcpyW(string,divider); - } - else - { - strcpyW(entry,buffer); - string[0]=0; - } - - TRACE("Writing %s = %s in %s of file %s\n",debugstr_w(entry), - debugstr_w(string),debugstr_w(section),debugstr_w(filename)); - WritePrivateProfileStringW(section,entry,string,filename); - - } - return TRUE; -} - -static BOOL update_ini_fields_callback( HINF hinf, PCWSTR field, void *arg ) -{ - FIXME( "should update ini fields %s\n", debugstr_w(field) ); - return TRUE; -} - -static BOOL ini2reg_callback( HINF hinf, PCWSTR field, void *arg ) -{ - FIXME( "should do ini2reg %s\n", debugstr_w(field) ); - return TRUE; -} - -static BOOL logconf_callback( HINF hinf, PCWSTR field, void *arg ) -{ - FIXME( "should do logconf %s\n", debugstr_w(field) ); - return TRUE; -} - -static BOOL bitreg_callback( HINF hinf, PCWSTR field, void *arg ) -{ - FIXME( "should do bitreg %s\n", debugstr_w(field) ); - return TRUE; -} - -static BOOL profile_items_callback( HINF hinf, PCWSTR field, void *arg ) -{ - FIXME( "should do profile items %s\n", debugstr_w(field) ); - return TRUE; -} - -static BOOL copy_inf_callback( HINF hinf, PCWSTR field, void *arg ) -{ - FIXME( "should do copy inf %s\n", debugstr_w(field) ); - return TRUE; -} - - -/*********************************************************************** - * iterate_section_fields - * - * Iterate over all fields of a certain key of a certain section - */ -static BOOL iterate_section_fields( HINF hinf, PCWSTR section, PCWSTR key, - iterate_fields_func callback, void *arg ) -{ - WCHAR static_buffer[200]; - WCHAR *buffer = static_buffer; - DWORD size = sizeof(static_buffer)/sizeof(WCHAR); - INFCONTEXT context; - BOOL ret = FALSE; - - BOOL ok = SetupFindFirstLineW( hinf, section, key, &context ); - while (ok) - { - UINT i, count = SetupGetFieldCount( &context ); - for (i = 1; i <= count; i++) - { - if (!(buffer = get_field_string( &context, i, buffer, static_buffer, &size ))) - goto done; - if (!callback( hinf, buffer, arg )) - { - WARN("callback failed for %s %s err %ld\n", - debugstr_w(section), debugstr_w(buffer), GetLastError() ); - goto done; - } - } - ok = SetupFindNextMatchLineW( &context, key, &context ); - } - ret = TRUE; - done: - if (buffer && buffer != static_buffer) HeapFree( GetProcessHeap(), 0, buffer ); - return ret; -} - - -/*********************************************************************** - * SetupInstallFilesFromInfSectionA (SETUPAPI.@) - */ -BOOL WINAPI SetupInstallFilesFromInfSectionA( HINF hinf, HINF hlayout, HSPFILEQ queue, - PCSTR section, PCSTR src_root, UINT flags ) -{ - UNICODE_STRING sectionW; - BOOL ret = FALSE; - - if (!RtlCreateUnicodeStringFromAsciiz( §ionW, section )) - { - SetLastError( ERROR_NOT_ENOUGH_MEMORY ); - return FALSE; - } - if (!src_root) - ret = SetupInstallFilesFromInfSectionW( hinf, hlayout, queue, sectionW.Buffer, - NULL, flags ); - else - { - UNICODE_STRING srcW; - if (RtlCreateUnicodeStringFromAsciiz( &srcW, src_root )) - { - ret = SetupInstallFilesFromInfSectionW( hinf, hlayout, queue, sectionW.Buffer, - srcW.Buffer, flags ); - RtlFreeUnicodeString( &srcW ); - } - else SetLastError( ERROR_NOT_ENOUGH_MEMORY ); - } - RtlFreeUnicodeString( §ionW ); - return ret; -} - - -/*********************************************************************** - * SetupInstallFilesFromInfSectionW (SETUPAPI.@) - */ -BOOL WINAPI SetupInstallFilesFromInfSectionW( HINF hinf, HINF hlayout, HSPFILEQ queue, - PCWSTR section, PCWSTR src_root, UINT flags ) -{ - struct files_callback_info info; - - info.queue = queue; - info.src_root = src_root; - info.copy_flags = flags; - info.layout = hlayout; - return iterate_section_fields( hinf, section, CopyFiles, copy_files_callback, &info ); -} - - -/*********************************************************************** - * SetupInstallFromInfSectionA (SETUPAPI.@) - */ -BOOL WINAPI SetupInstallFromInfSectionA( HWND owner, HINF hinf, PCSTR section, UINT flags, - HKEY key_root, PCSTR src_root, UINT copy_flags, - PSP_FILE_CALLBACK_A callback, PVOID context, - HDEVINFO devinfo, PSP_DEVINFO_DATA devinfo_data ) -{ - UNICODE_STRING sectionW, src_rootW; - struct callback_WtoA_context ctx; - BOOL ret = FALSE; - - src_rootW.Buffer = NULL; - if (src_root && !RtlCreateUnicodeStringFromAsciiz( &src_rootW, src_root )) - { - SetLastError( ERROR_NOT_ENOUGH_MEMORY ); - return FALSE; - } - - if (RtlCreateUnicodeStringFromAsciiz( §ionW, section )) - { - ctx.orig_context = context; - ctx.orig_handler = callback; - ret = SetupInstallFromInfSectionW( owner, hinf, sectionW.Buffer, flags, key_root, - src_rootW.Buffer, copy_flags, QUEUE_callback_WtoA, - &ctx, devinfo, devinfo_data ); - RtlFreeUnicodeString( §ionW ); - } - else SetLastError( ERROR_NOT_ENOUGH_MEMORY ); - - RtlFreeUnicodeString( &src_rootW ); - return ret; -} - - -/*********************************************************************** - * SetupInstallFromInfSectionW (SETUPAPI.@) - */ -BOOL WINAPI SetupInstallFromInfSectionW( HWND owner, HINF hinf, PCWSTR section, UINT flags, - HKEY key_root, PCWSTR src_root, UINT copy_flags, - PSP_FILE_CALLBACK_W callback, PVOID context, - HDEVINFO devinfo, PSP_DEVINFO_DATA devinfo_data ) -{ - if (flags & SPINST_FILES) - { - struct files_callback_info info; - HSPFILEQ queue; - BOOL ret; - - if (!(queue = SetupOpenFileQueue())) return FALSE; - info.queue = queue; - info.src_root = src_root; - info.copy_flags = copy_flags; - info.layout = hinf; - ret = (iterate_section_fields( hinf, section, CopyFiles, copy_files_callback, &info ) && - iterate_section_fields( hinf, section, DelFiles, delete_files_callback, &info ) && - iterate_section_fields( hinf, section, RenFiles, rename_files_callback, &info ) && - SetupCommitFileQueueW( owner, queue, callback, context )); - SetupCloseFileQueue( queue ); - if (!ret) return FALSE; - } - if (flags & SPINST_INIFILES) - { - if (!iterate_section_fields( hinf, section, UpdateInis, update_ini_callback, NULL ) || - !iterate_section_fields( hinf, section, UpdateIniFields, - update_ini_fields_callback, NULL )) - return FALSE; - } - if (flags & SPINST_INI2REG) - { - if (!iterate_section_fields( hinf, section, Ini2Reg, ini2reg_callback, NULL )) - return FALSE; - } - if (flags & SPINST_LOGCONFIG) - { - if (!iterate_section_fields( hinf, section, LogConf, logconf_callback, NULL )) - return FALSE; - } - if (flags & SPINST_REGSVR) - { - struct register_dll_info info; - - info.unregister = FALSE; - if (flags & SPINST_REGISTERCALLBACKAWARE) - { - info.callback = callback; - info.callback_context = context; - } - else info.callback = NULL; - - if (!iterate_section_fields( hinf, section, RegisterDlls, register_dlls_callback, &info )) - return FALSE; - } - if (flags & SPINST_UNREGSVR) - { - struct register_dll_info info; - - info.unregister = TRUE; - if (flags & SPINST_REGISTERCALLBACKAWARE) - { - info.callback = callback; - info.callback_context = context; - } - else info.callback = NULL; - - if (!iterate_section_fields( hinf, section, UnregisterDlls, register_dlls_callback, &info )) - return FALSE; - } - if (flags & SPINST_REGISTRY) - { - struct registry_callback_info info; - - info.default_root = key_root; - info.delete = TRUE; - if (!iterate_section_fields( hinf, section, DelReg, registry_callback, &info )) - return FALSE; - info.delete = FALSE; - if (!iterate_section_fields( hinf, section, AddReg, registry_callback, &info )) - return FALSE; - } - if (flags & SPINST_BITREG) - { - if (!iterate_section_fields( hinf, section, BitReg, bitreg_callback, NULL )) - return FALSE; - } - if (flags & SPINST_PROFILEITEMS) - { - if (!iterate_section_fields( hinf, section, ProfileItems, profile_items_callback, NULL )) - return FALSE; - } - if (flags & SPINST_COPYINF) - { - if (!iterate_section_fields( hinf, section, CopyINF, copy_inf_callback, NULL )) - return FALSE; - } - - return TRUE; -} - - -/*********************************************************************** - * InstallHinfSectionW (SETUPAPI.@) - * - * NOTE: 'cmdline' is
from - * RUNDLL32.EXE SETUPAPI.DLL,InstallHinfSection
- */ -void WINAPI InstallHinfSectionW( HWND hwnd, HINSTANCE handle, LPCWSTR cmdline, INT show ) -{ - WCHAR *p, *path, section[MAX_PATH]; - void *callback_context; - UINT mode; - HINF hinf; - - TRACE("hwnd %p, handle %p, cmdline %s\n", hwnd, handle, debugstr_w(cmdline)); - - lstrcpynW( section, cmdline, sizeof(section)/sizeof(WCHAR) ); - - if (!(p = strchrW( section, ' ' ))) return; - *p++ = 0; - while (*p == ' ') p++; - mode = atoiW( p ); - - if (!(p = strchrW( p, ' ' ))) return; - path = p + 1; - while (*path == ' ') path++; - - hinf = SetupOpenInfFileW( path, NULL, INF_STYLE_WIN4, NULL ); - if (hinf == INVALID_HANDLE_VALUE) return; - - callback_context = SetupInitDefaultQueueCallback( hwnd ); - SetupInstallFromInfSectionW( hwnd, hinf, section, SPINST_ALL, NULL, NULL, SP_COPY_NEWER, - SetupDefaultQueueCallbackW, callback_context, - NULL, NULL ); - SetupTermDefaultQueueCallback( callback_context ); - SetupCloseInfFile( hinf ); - - /* FIXME: should check the mode and maybe reboot */ - /* there isn't much point in doing that since we */ - /* don't yet handle deferred file copies anyway. */ -} - - -/*********************************************************************** - * InstallHinfSectionA (SETUPAPI.@) - */ -void WINAPI InstallHinfSectionA( HWND hwnd, HINSTANCE handle, LPCSTR cmdline, INT show ) -{ - UNICODE_STRING cmdlineW; - - if (RtlCreateUnicodeStringFromAsciiz( &cmdlineW, cmdline )) - { - InstallHinfSectionW( hwnd, handle, cmdlineW.Buffer, show ); - RtlFreeUnicodeString( &cmdlineW ); - } -} diff --git a/reactos/lib/setupapi/makefile b/reactos/lib/setupapi/makefile deleted file mode 100644 index fa2e9d9f853..00000000000 --- a/reactos/lib/setupapi/makefile +++ /dev/null @@ -1,9 +0,0 @@ -# $Id$ - -PATH_TO_TOP = ../.. - -TARGET_TYPE = winedll - -include $(PATH_TO_TOP)/rules.mak - -include $(TOOLS_PATH)/helper.mk diff --git a/reactos/lib/setupapi/parser.c b/reactos/lib/setupapi/parser.c deleted file mode 100644 index 1cf0bfe20d7..00000000000 --- a/reactos/lib/setupapi/parser.c +++ /dev/null @@ -1,1841 +0,0 @@ -/* - * INF file parsing - * - * Copyright 2002 Alexandre Julliard for CodeWeavers - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include "config.h" -#include "wine/port.h" - -#include -#include -#include -#include -#include - -#include "windef.h" -#include "winbase.h" -#include "wingdi.h" -#include "winuser.h" -#include "winnls.h" -#include "winreg.h" -#include "winternl.h" -#include "winerror.h" -#include "setupapi.h" -#include "setupapi_private.h" - -#include "wine/unicode.h" -#include "wine/debug.h" - -WINE_DEFAULT_DEBUG_CHANNEL(setupapi); - -#define CONTROL_Z '\x1a' -#define MAX_SECTION_NAME_LEN 255 -#define MAX_FIELD_LEN 511 /* larger fields get silently truncated */ -/* actual string limit is MAX_INF_STRING_LENGTH+1 (plus terminating null) under Windows */ -#define MAX_STRING_LEN (MAX_INF_STRING_LENGTH+1) - -/* inf file structure definitions */ - -struct field -{ - const WCHAR *text; /* field text */ -}; - -struct line -{ - int first_field; /* index of first field in field array */ - int nb_fields; /* number of fields in line */ - int key_field; /* index of field for key or -1 if no key */ -}; - -struct section -{ - const WCHAR *name; /* section name */ - unsigned int nb_lines; /* number of used lines */ - unsigned int alloc_lines; /* total number of allocated lines in array below */ - struct line lines[16]; /* lines information (grown dynamically, 16 is initial size) */ -}; - -struct inf_file -{ - struct inf_file *next; /* next appended file */ - WCHAR *strings; /* buffer for string data (section names and field values) */ - WCHAR *string_pos; /* position of next available string in buffer */ - unsigned int nb_sections; /* number of used sections */ - unsigned int alloc_sections; /* total number of allocated section pointers */ - struct section **sections; /* section pointers array */ - unsigned int nb_fields; - unsigned int alloc_fields; - struct field *fields; - int strings_section; /* index of [Strings] section or -1 if none */ - WCHAR *src_root; /* source root directory */ -}; - -/* parser definitions */ - -enum parser_state -{ - LINE_START, /* at beginning of a line */ - SECTION_NAME, /* parsing a section name */ - KEY_NAME, /* parsing a key name */ - VALUE_NAME, /* parsing a value name */ - EOL_BACKSLASH, /* backslash at end of line */ - QUOTES, /* inside quotes */ - LEADING_SPACES, /* leading spaces */ - TRAILING_SPACES, /* trailing spaces */ - COMMENT, /* inside a comment */ - NB_PARSER_STATES -}; - -struct parser -{ - const WCHAR *start; /* start position of item being parsed */ - const WCHAR *end; /* end of buffer */ - struct inf_file *file; /* file being built */ - enum parser_state state; /* current parser state */ - enum parser_state stack[4]; /* state stack */ - int stack_pos; /* current pos in stack */ - - int cur_section; /* index of section being parsed*/ - struct line *line; /* current line */ - unsigned int line_pos; /* current line position in file */ - unsigned int error; /* error code */ - unsigned int token_len; /* current token len */ - WCHAR token[MAX_FIELD_LEN+1]; /* current token */ -}; - -typedef const WCHAR * (*parser_state_func)( struct parser *parser, const WCHAR *pos ); - -/* parser state machine functions */ -static const WCHAR *line_start_state( struct parser *parser, const WCHAR *pos ); -static const WCHAR *section_name_state( struct parser *parser, const WCHAR *pos ); -static const WCHAR *key_name_state( struct parser *parser, const WCHAR *pos ); -static const WCHAR *value_name_state( struct parser *parser, const WCHAR *pos ); -static const WCHAR *eol_backslash_state( struct parser *parser, const WCHAR *pos ); -static const WCHAR *quotes_state( struct parser *parser, const WCHAR *pos ); -static const WCHAR *leading_spaces_state( struct parser *parser, const WCHAR *pos ); -static const WCHAR *trailing_spaces_state( struct parser *parser, const WCHAR *pos ); -static const WCHAR *comment_state( struct parser *parser, const WCHAR *pos ); - -static const parser_state_func parser_funcs[NB_PARSER_STATES] = -{ - line_start_state, /* LINE_START */ - section_name_state, /* SECTION_NAME */ - key_name_state, /* KEY_NAME */ - value_name_state, /* VALUE_NAME */ - eol_backslash_state, /* EOL_BACKSLASH */ - quotes_state, /* QUOTES */ - leading_spaces_state, /* LEADING_SPACES */ - trailing_spaces_state, /* TRAILING_SPACES */ - comment_state /* COMMENT */ -}; - - -/* Unicode string constants */ -static const WCHAR Version[] = {'V','e','r','s','i','o','n',0}; -static const WCHAR Signature[] = {'S','i','g','n','a','t','u','r','e',0}; -static const WCHAR Chicago[] = {'$','C','h','i','c','a','g','o','$',0}; -static const WCHAR WindowsNT[] = {'$','W','i','n','d','o','w','s',' ','N','T','$',0}; -static const WCHAR Windows95[] = {'$','W','i','n','d','o','w','s',' ','9','5','$',0}; -static const WCHAR LayoutFile[] = {'L','a','y','o','u','t','F','i','l','e',0}; - -/* extend an array, allocating more memory if necessary */ -static void *grow_array( void *array, unsigned int *count, size_t elem ) -{ - void *new_array; - unsigned int new_count = *count + *count / 2; - if (new_count < 32) new_count = 32; - - if (array) - new_array = HeapReAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, array, new_count * elem ); - else - new_array = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, new_count * elem ); - - if (new_array) - *count = new_count; - else - if (array) - HeapFree( GetProcessHeap(), 0, array ); - return new_array; -} - - -/* find a section by name */ -static int find_section( struct inf_file *file, const WCHAR *name ) -{ - int i; - - for (i = 0; i < file->nb_sections; i++) - if (!strcmpiW( name, file->sections[i]->name )) return i; - return -1; -} - - -/* find a line by name */ -static struct line *find_line( struct inf_file *file, int section_index, const WCHAR *name ) -{ - struct section *section; - struct line *line; - int i; - - if (section_index < 0 || section_index >= file->nb_sections) return NULL; - section = file->sections[section_index]; - for (i = 0, line = section->lines; i < section->nb_lines; i++, line++) - { - if (line->key_field == -1) continue; - if (!strcmpiW( name, file->fields[line->key_field].text )) return line; - } - return NULL; -} - - -/* add a section to the file and return the section index */ -static int add_section( struct inf_file *file, const WCHAR *name ) -{ - struct section *section; - - if (file->nb_sections >= file->alloc_sections) - { - if (!(file->sections = grow_array( file->sections, &file->alloc_sections, - sizeof(file->sections[0]) ))) return -1; - } - if (!(section = HeapAlloc( GetProcessHeap(), 0, sizeof(*section) ))) return -1; - section->name = name; - section->nb_lines = 0; - section->alloc_lines = sizeof(section->lines)/sizeof(section->lines[0]); - file->sections[file->nb_sections] = section; - return file->nb_sections++; -} - - -/* add a line to a given section */ -static struct line *add_line( struct inf_file *file, int section_index ) -{ - struct section *section; - struct line *line; - - assert( section_index >= 0 && section_index < file->nb_sections ); - - section = file->sections[section_index]; - if (section->nb_lines == section->alloc_lines) /* need to grow the section */ - { - int size = sizeof(*section) - sizeof(section->lines) + 2*section->alloc_lines*sizeof(*line); - if (!(section = HeapReAlloc( GetProcessHeap(), 0, section, size ))) return NULL; - section->alloc_lines *= 2; - file->sections[section_index] = section; - } - line = §ion->lines[section->nb_lines++]; - line->first_field = file->nb_fields; - line->nb_fields = 0; - line->key_field = -1; - return line; -} - - -/* retrieve a given line from section/line index */ -inline static struct line *get_line( struct inf_file *file, unsigned int section_index, - unsigned int line_index ) -{ - struct section *section; - - if (section_index >= file->nb_sections) return NULL; - section = file->sections[section_index]; - if (line_index >= section->nb_lines) return NULL; - return §ion->lines[line_index]; -} - - -/* retrieve a given field from section/line/field index */ -static struct field *get_field( struct inf_file *file, int section_index, int line_index, - int field_index ) -{ - struct line *line = get_line( file, section_index, line_index ); - - if (!line) return NULL; - if (!field_index) /* get the key */ - { - if (line->key_field == -1) return NULL; - return &file->fields[line->key_field]; - } - field_index--; - if (field_index >= line->nb_fields) return NULL; - return &file->fields[line->first_field + field_index]; -} - - -/* allocate a new field, growing the array if necessary */ -static struct field *add_field( struct inf_file *file, const WCHAR *text ) -{ - struct field *field; - - if (file->nb_fields >= file->alloc_fields) - { - if (!(file->fields = grow_array( file->fields, &file->alloc_fields, - sizeof(file->fields[0]) ))) return NULL; - } - field = &file->fields[file->nb_fields++]; - field->text = text; - return field; -} - - -/* retrieve the string substitution for a directory id */ -static const WCHAR *get_dirid_subst( int dirid, unsigned int *len ) -{ - extern const WCHAR *DIRID_get_string( HINF hinf, int dirid ); - const WCHAR *ret = DIRID_get_string( 0, dirid ); - if (ret) *len = strlenW(ret); - return ret; -} - - -/* retrieve the string substitution for a given string, or NULL if not found */ -/* if found, len is set to the substitution length */ -static const WCHAR *get_string_subst( struct inf_file *file, const WCHAR *str, unsigned int *len ) -{ - static const WCHAR percent = '%'; - - struct section *strings_section; - struct line *line; - struct field *field; - int i, dirid; - WCHAR *dirid_str, *end; - const WCHAR *ret = NULL; - - if (!*len) /* empty string (%%) is replaced by single percent */ - { - *len = 1; - return &percent; - } - if (file->strings_section == -1) goto not_found; - strings_section = file->sections[file->strings_section]; - for (i = 0, line = strings_section->lines; i < strings_section->nb_lines; i++, line++) - { - if (line->key_field == -1) continue; - if (strncmpiW( str, file->fields[line->key_field].text, *len )) continue; - if (!file->fields[line->key_field].text[*len]) break; - } - if (i == strings_section->nb_lines || !line->nb_fields) goto not_found; - field = &file->fields[line->first_field]; - *len = strlenW( field->text ); - return field->text; - - not_found: /* check for integer id */ - if ((dirid_str = HeapAlloc( GetProcessHeap(), 0, (*len+1) * sizeof(WCHAR) ))) - { - memcpy( dirid_str, str, *len * sizeof(WCHAR) ); - dirid_str[*len] = 0; - dirid = strtolW( dirid_str, &end, 10 ); - if (!*end) ret = get_dirid_subst( dirid, len ); - HeapFree( GetProcessHeap(), 0, dirid_str ); - return ret; - } - return NULL; -} - - -/* do string substitutions on the specified text */ -/* the buffer is assumed to be large enough */ -/* returns necessary length not including terminating null */ -unsigned int PARSER_string_substW( struct inf_file *file, const WCHAR *text, WCHAR *buffer, - unsigned int size ) -{ - const WCHAR *start, *subst, *p; - unsigned int len, total = 0; - int inside = 0; - - if (!buffer) size = MAX_STRING_LEN + 1; - for (p = start = text; *p; p++) - { - if (*p != '%') continue; - inside = !inside; - if (inside) /* start of a %xx% string */ - { - len = p - start; - if (len > size - 1) len = size - 1; - if (buffer) memcpy( buffer + total, start, len * sizeof(WCHAR) ); - total += len; - size -= len; - start = p; - } - else /* end of the %xx% string, find substitution */ - { - len = p - start - 1; - subst = get_string_subst( file, start + 1, &len ); - if (!subst) - { - subst = start; - len = p - start + 1; - } - if (len > size - 1) len = size - 1; - if (buffer) memcpy( buffer + total, subst, len * sizeof(WCHAR) ); - total += len; - size -= len; - start = p + 1; - } - } - - if (start != p) /* unfinished string, copy it */ - { - len = p - start; - if (len > size - 1) len = size - 1; - if (buffer) memcpy( buffer + total, start, len * sizeof(WCHAR) ); - total += len; - } - if (buffer && size) buffer[total] = 0; - return total; -} - - -/* do string substitutions on the specified text */ -/* the buffer is assumed to be large enough */ -/* returns necessary length not including terminating null */ -unsigned int PARSER_string_substA( struct inf_file *file, const WCHAR *text, char *buffer, - unsigned int size ) -{ - WCHAR buffW[MAX_STRING_LEN+1]; - DWORD ret; - - unsigned int len = PARSER_string_substW( file, text, buffW, sizeof(buffW)/sizeof(WCHAR) ); - if (!buffer) RtlUnicodeToMultiByteSize( &ret, buffW, len * sizeof(WCHAR) ); - else - { - RtlUnicodeToMultiByteN( buffer, size-1, &ret, buffW, len * sizeof(WCHAR) ); - buffer[ret] = 0; - } - return ret; -} - - -/* push some string data into the strings buffer */ -static WCHAR *push_string( struct inf_file *file, const WCHAR *string ) -{ - WCHAR *ret = file->string_pos; - strcpyW( ret, string ); - file->string_pos += strlenW( ret ) + 1; - return ret; -} - - -/* push the current state on the parser stack */ -inline static void push_state( struct parser *parser, enum parser_state state ) -{ - assert( parser->stack_pos < sizeof(parser->stack)/sizeof(parser->stack[0]) ); - parser->stack[parser->stack_pos++] = state; -} - - -/* pop the current state */ -inline static void pop_state( struct parser *parser ) -{ - assert( parser->stack_pos ); - parser->state = parser->stack[--parser->stack_pos]; -} - - -/* set the parser state and return the previous one */ -inline static enum parser_state set_state( struct parser *parser, enum parser_state state ) -{ - enum parser_state ret = parser->state; - parser->state = state; - return ret; -} - - -/* check if the pointer points to an end of file */ -inline static int is_eof( struct parser *parser, const WCHAR *ptr ) -{ - return (ptr >= parser->end || *ptr == CONTROL_Z); -} - - -/* check if the pointer points to an end of line */ -inline static int is_eol( struct parser *parser, const WCHAR *ptr ) -{ - return (ptr >= parser->end || *ptr == CONTROL_Z || *ptr == '\n'); -} - - -/* push data from current token start up to pos into the current token */ -static int push_token( struct parser *parser, const WCHAR *pos ) -{ - int len = pos - parser->start; - const WCHAR *src = parser->start; - WCHAR *dst = parser->token + parser->token_len; - - if (len > MAX_FIELD_LEN - parser->token_len) len = MAX_FIELD_LEN - parser->token_len; - - parser->token_len += len; - for ( ; len > 0; len--, dst++, src++) *dst = *src ? *src : ' '; - *dst = 0; - parser->start = pos; - return 0; -} - - -/* add a section with the current token as name */ -static int add_section_from_token( struct parser *parser ) -{ - int section_index; - - if (parser->token_len > MAX_SECTION_NAME_LEN) - { - parser->error = ERROR_SECTION_NAME_TOO_LONG; - return -1; - } - if ((section_index = find_section( parser->file, parser->token )) == -1) - { - /* need to create a new one */ - const WCHAR *name = push_string( parser->file, parser->token ); - if ((section_index = add_section( parser->file, name )) == -1) - { - parser->error = ERROR_NOT_ENOUGH_MEMORY; - return -1; - } - } - parser->token_len = 0; - parser->cur_section = section_index; - return section_index; -} - - -/* add a field containing the current token to the current line */ -static struct field *add_field_from_token( struct parser *parser, int is_key ) -{ - struct field *field; - WCHAR *text; - - if (!parser->line) /* need to start a new line */ - { - if (parser->cur_section == -1) /* got a line before the first section */ - { - parser->error = ERROR_WRONG_INF_STYLE; - return NULL; - } - if (!(parser->line = add_line( parser->file, parser->cur_section ))) goto error; - } - else assert(!is_key); - - text = push_string( parser->file, parser->token ); - if ((field = add_field( parser->file, text ))) - { - if (!is_key) parser->line->nb_fields++; - else - { - /* replace first field by key field */ - parser->line->key_field = parser->line->first_field; - parser->line->first_field++; - } - parser->token_len = 0; - return field; - } - error: - parser->error = ERROR_NOT_ENOUGH_MEMORY; - return NULL; -} - - -/* close the current line and prepare for parsing a new one */ -static void close_current_line( struct parser *parser ) -{ - struct line *cur_line = parser->line; - - if (cur_line) - { - /* if line has a single field and no key, the field is the key too */ - if (cur_line->nb_fields == 1 && cur_line->key_field == -1) - cur_line->key_field = cur_line->first_field; - } - parser->line = NULL; -} - - -/* handler for parser LINE_START state */ -static const WCHAR *line_start_state( struct parser *parser, const WCHAR *pos ) -{ - const WCHAR *p; - - for (p = pos; !is_eof( parser, p ); p++) - { - switch(*p) - { - case '\n': - parser->line_pos++; - close_current_line( parser ); - break; - case ';': - push_state( parser, LINE_START ); - set_state( parser, COMMENT ); - return p + 1; - case '[': - parser->start = p + 1; - set_state( parser, SECTION_NAME ); - return p + 1; - default: - if (!isspaceW(*p)) - { - parser->start = p; - set_state( parser, KEY_NAME ); - return p; - } - break; - } - } - close_current_line( parser ); - return NULL; -} - - -/* handler for parser SECTION_NAME state */ -static const WCHAR *section_name_state( struct parser *parser, const WCHAR *pos ) -{ - const WCHAR *p; - - for (p = pos; !is_eol( parser, p ); p++) - { - if (*p == ']') - { - push_token( parser, p ); - if (add_section_from_token( parser ) == -1) return NULL; - push_state( parser, LINE_START ); - set_state( parser, COMMENT ); /* ignore everything else on the line */ - return p + 1; - } - } - parser->error = ERROR_BAD_SECTION_NAME_LINE; /* unfinished section name */ - return NULL; -} - - -/* handler for parser KEY_NAME state */ -static const WCHAR *key_name_state( struct parser *parser, const WCHAR *pos ) -{ - const WCHAR *p, *token_end = parser->start; - - for (p = pos; !is_eol( parser, p ); p++) - { - if (*p == ',') break; - switch(*p) - { - - case '=': - push_token( parser, token_end ); - if (!add_field_from_token( parser, 1 )) return NULL; - parser->start = p + 1; - push_state( parser, VALUE_NAME ); - set_state( parser, LEADING_SPACES ); - return p + 1; - case ';': - push_token( parser, token_end ); - if (!add_field_from_token( parser, 0 )) return NULL; - push_state( parser, LINE_START ); - set_state( parser, COMMENT ); - return p + 1; - case '"': - push_token( parser, token_end ); - parser->start = p + 1; - push_state( parser, KEY_NAME ); - set_state( parser, QUOTES ); - return p + 1; - case '\\': - push_token( parser, token_end ); - parser->start = p; - push_state( parser, KEY_NAME ); - set_state( parser, EOL_BACKSLASH ); - return p; - default: - if (!isspaceW(*p)) token_end = p + 1; - else - { - push_token( parser, p ); - push_state( parser, KEY_NAME ); - set_state( parser, TRAILING_SPACES ); - return p; - } - break; - } - } - push_token( parser, token_end ); - set_state( parser, VALUE_NAME ); - return p; -} - - -/* handler for parser VALUE_NAME state */ -static const WCHAR *value_name_state( struct parser *parser, const WCHAR *pos ) -{ - const WCHAR *p, *token_end = parser->start; - - for (p = pos; !is_eol( parser, p ); p++) - { - switch(*p) - { - case ';': - push_token( parser, token_end ); - if (!add_field_from_token( parser, 0 )) return NULL; - push_state( parser, LINE_START ); - set_state( parser, COMMENT ); - return p + 1; - case ',': - push_token( parser, token_end ); - if (!add_field_from_token( parser, 0 )) return NULL; - parser->start = p + 1; - push_state( parser, VALUE_NAME ); - set_state( parser, LEADING_SPACES ); - return p + 1; - case '"': - push_token( parser, token_end ); - parser->start = p + 1; - push_state( parser, VALUE_NAME ); - set_state( parser, QUOTES ); - return p + 1; - case '\\': - push_token( parser, token_end ); - parser->start = p; - push_state( parser, VALUE_NAME ); - set_state( parser, EOL_BACKSLASH ); - return p; - default: - if (!isspaceW(*p)) token_end = p + 1; - else - { - push_token( parser, p ); - push_state( parser, VALUE_NAME ); - set_state( parser, TRAILING_SPACES ); - return p; - } - break; - } - } - push_token( parser, token_end ); - if (!add_field_from_token( parser, 0 )) return NULL; - set_state( parser, LINE_START ); - return p; -} - - -/* handler for parser EOL_BACKSLASH state */ -static const WCHAR *eol_backslash_state( struct parser *parser, const WCHAR *pos ) -{ - const WCHAR *p; - - for (p = pos; !is_eof( parser, p ); p++) - { - switch(*p) - { - case '\n': - parser->line_pos++; - parser->start = p + 1; - set_state( parser, LEADING_SPACES ); - return p + 1; - case '\\': - continue; - case ';': - push_state( parser, EOL_BACKSLASH ); - set_state( parser, COMMENT ); - return p + 1; - default: - if (isspaceW(*p)) continue; - push_token( parser, p ); - pop_state( parser ); - return p; - } - } - parser->start = p; - pop_state( parser ); - return p; -} - - -/* handler for parser QUOTES state */ -static const WCHAR *quotes_state( struct parser *parser, const WCHAR *pos ) -{ - const WCHAR *p, *token_end = parser->start; - - for (p = pos; !is_eol( parser, p ); p++) - { - if (*p == '"') - { - if (p+1 < parser->end && p[1] == '"') /* double quotes */ - { - push_token( parser, p + 1 ); - parser->start = token_end = p + 2; - p++; - } - else /* end of quotes */ - { - push_token( parser, p ); - parser->start = p + 1; - pop_state( parser ); - return p + 1; - } - } - } - push_token( parser, p ); - pop_state( parser ); - return p; -} - - -/* handler for parser LEADING_SPACES state */ -static const WCHAR *leading_spaces_state( struct parser *parser, const WCHAR *pos ) -{ - const WCHAR *p; - - for (p = pos; !is_eol( parser, p ); p++) - { - if (*p == '\\') - { - parser->start = p; - set_state( parser, EOL_BACKSLASH ); - return p; - } - if (!isspaceW(*p)) break; - } - parser->start = p; - pop_state( parser ); - return p; -} - - -/* handler for parser TRAILING_SPACES state */ -static const WCHAR *trailing_spaces_state( struct parser *parser, const WCHAR *pos ) -{ - const WCHAR *p; - - for (p = pos; !is_eol( parser, p ); p++) - { - if (*p == '\\') - { - set_state( parser, EOL_BACKSLASH ); - return p; - } - if (!isspaceW(*p)) break; - } - pop_state( parser ); - return p; -} - - -/* handler for parser COMMENT state */ -static const WCHAR *comment_state( struct parser *parser, const WCHAR *pos ) -{ - const WCHAR *p = pos; - - while (!is_eol( parser, p )) p++; - pop_state( parser ); - return p; -} - - -/* parse a complete buffer */ -static DWORD parse_buffer( struct inf_file *file, const WCHAR *buffer, const WCHAR *end, - UINT *error_line ) -{ - static const WCHAR Strings[] = {'S','t','r','i','n','g','s',0}; - - struct parser parser; - const WCHAR *pos = buffer; - - parser.start = buffer; - parser.end = end; - parser.file = file; - parser.line = NULL; - parser.state = LINE_START; - parser.stack_pos = 0; - parser.cur_section = -1; - parser.line_pos = 1; - parser.error = 0; - parser.token_len = 0; - - /* parser main loop */ - while (pos) pos = (parser_funcs[parser.state])( &parser, pos ); - - /* trim excess buffer space */ - if (file->alloc_sections > file->nb_sections) - { - file->sections = HeapReAlloc( GetProcessHeap(), 0, file->sections, - file->nb_sections * sizeof(file->sections[0]) ); - file->alloc_sections = file->nb_sections; - } - if (file->alloc_fields > file->nb_fields) - { - file->fields = HeapReAlloc( GetProcessHeap(), 0, file->fields, - file->nb_fields * sizeof(file->fields[0]) ); - file->alloc_fields = file->nb_fields; - } - file->strings = HeapReAlloc( GetProcessHeap(), HEAP_REALLOC_IN_PLACE_ONLY, file->strings, - (file->string_pos - file->strings) * sizeof(WCHAR) ); - - if (parser.error) - { - if (error_line) *error_line = parser.line_pos; - return parser.error; - } - - /* find the [strings] section */ - file->strings_section = find_section( file, Strings ); - return 0; -} - - -/* append a child INF file to its parent list, in a thread-safe manner */ -static void append_inf_file( struct inf_file *parent, struct inf_file *child ) -{ - struct inf_file **ppnext = &parent->next; - child->next = NULL; - - for (;;) - { - struct inf_file *next = InterlockedCompareExchangePointer( (void **)ppnext, child, NULL ); - if (!next) return; - ppnext = &next->next; - } -} - - -/*********************************************************************** - * parse_file - * - * parse an INF file. - */ -static struct inf_file *parse_file( HANDLE handle, const WCHAR *class, UINT *error_line ) -{ - void *buffer; - DWORD err = 0; - struct inf_file *file; - - DWORD size = GetFileSize( handle, NULL ); - HANDLE mapping = CreateFileMappingW( handle, NULL, PAGE_READONLY, 0, size, NULL ); - if (!mapping) return NULL; - buffer = MapViewOfFile( mapping, FILE_MAP_READ, 0, 0, size ); - NtClose( mapping ); - if (!buffer) return NULL; - - if (class) FIXME( "class %s not supported yet\n", debugstr_w(class) ); - - if (!(file = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*file) ))) - { - err = ERROR_NOT_ENOUGH_MEMORY; - goto done; - } - - /* we won't need more strings space than the size of the file, - * so we can preallocate it here - */ - if (!(file->strings = HeapAlloc( GetProcessHeap(), 0, size * sizeof(WCHAR) ))) - { - err = ERROR_NOT_ENOUGH_MEMORY; - goto done; - } - file->string_pos = file->strings; - file->strings_section = -1; - - if (!RtlIsTextUnicode( buffer, size, NULL )) - { - WCHAR *new_buff = HeapAlloc( GetProcessHeap(), 0, size * sizeof(WCHAR) ); - if (new_buff) - { - DWORD len = MultiByteToWideChar( CP_ACP, 0, buffer, size, new_buff, - size * sizeof(WCHAR) ); - err = parse_buffer( file, new_buff, new_buff + len, error_line ); - HeapFree( GetProcessHeap(), 0, new_buff ); - } - } - else err = parse_buffer( file, buffer, (WCHAR *)((char *)buffer + size), error_line ); - - if (!err) /* now check signature */ - { - int version_index = find_section( file, Version ); - if (version_index != -1) - { - struct line *line = find_line( file, version_index, Signature ); - if (line && line->nb_fields > 0) - { - struct field *field = file->fields + line->first_field; - if (!strcmpiW( field->text, Chicago )) goto done; - if (!strcmpiW( field->text, WindowsNT )) goto done; - if (!strcmpiW( field->text, Windows95 )) goto done; - } - } - err = ERROR_WRONG_INF_STYLE; - } - - done: - UnmapViewOfFile( buffer ); - if (err) - { - HeapFree( GetProcessHeap(), 0, file ); - SetLastError( err ); - file = NULL; - } - return file; -} - - -/*********************************************************************** - * PARSER_get_src_root - * - * Retrieve the source directory of an inf file. - */ -const WCHAR *PARSER_get_src_root( HINF hinf ) -{ - struct inf_file *file = hinf; - return file->src_root; -} - - -/*********************************************************************** - * PARSER_get_dest_dir - * - * retrieve a destination dir of the form "dirid,relative_path" in the given entry. - * returned buffer must be freed by caller. - */ -WCHAR *PARSER_get_dest_dir( INFCONTEXT *context ) -{ - const WCHAR *dir; - WCHAR *ptr, *ret; - INT dirid; - DWORD len1, len2; - - if (!SetupGetIntField( context, 1, &dirid )) return NULL; - if (!(dir = DIRID_get_string( context->Inf, dirid ))) return NULL; - len1 = strlenW(dir) + 1; - if (!SetupGetStringFieldW( context, 2, NULL, 0, &len2 )) len2 = 0; - if (!(ret = HeapAlloc( GetProcessHeap(), 0, (len1+len2) * sizeof(WCHAR) ))) return NULL; - strcpyW( ret, dir ); - ptr = ret + strlenW(ret); - if (len2 && ptr > ret && ptr[-1] != '\\') *ptr++ = '\\'; - if (!SetupGetStringFieldW( context, 2, ptr, len2, NULL )) *ptr = 0; - return ret; -} - - -/*********************************************************************** - * SetupOpenInfFileA (SETUPAPI.@) - */ -HINF WINAPI SetupOpenInfFileA( PCSTR name, PCSTR class, DWORD style, UINT *error ) -{ - UNICODE_STRING nameW, classW; - HINF ret = (HINF)INVALID_HANDLE_VALUE; - - classW.Buffer = NULL; - if (class && !RtlCreateUnicodeStringFromAsciiz( &classW, class )) - { - SetLastError( ERROR_NOT_ENOUGH_MEMORY ); - return ret; - } - if (RtlCreateUnicodeStringFromAsciiz( &nameW, name )) - { - ret = SetupOpenInfFileW( nameW.Buffer, classW.Buffer, style, error ); - RtlFreeUnicodeString( &nameW ); - } - RtlFreeUnicodeString( &classW ); - return ret; -} - - -/*********************************************************************** - * SetupOpenInfFileW (SETUPAPI.@) - */ -HINF WINAPI SetupOpenInfFileW( PCWSTR name, PCWSTR class, DWORD style, UINT *error ) -{ - struct inf_file *file = NULL; - HANDLE handle; - WCHAR *path, *p; - UINT len; - - if (strchrW( name, '\\' ) || strchrW( name, '/' )) - { - if (!(len = GetFullPathNameW( name, 0, NULL, NULL ))) return (HINF)INVALID_HANDLE_VALUE; - if (!(path = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) ))) - { - SetLastError( ERROR_NOT_ENOUGH_MEMORY ); - return (HINF)INVALID_HANDLE_VALUE; - } - GetFullPathNameW( name, len, path, NULL ); - handle = CreateFileW( path, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0 ); - } - else /* try Windows directory */ - { - static const WCHAR Inf[] = {'\\','i','n','f','\\',0}; - static const WCHAR System32[] = {'\\','s','y','s','t','e','m','3','2','\\',0}; - - len = GetWindowsDirectoryW( NULL, 0 ) + strlenW(name) + 12; - if (!(path = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) ))) - { - SetLastError( ERROR_NOT_ENOUGH_MEMORY ); - return (HINF)INVALID_HANDLE_VALUE; - } - GetWindowsDirectoryW( path, len ); - p = path + strlenW(path); - strcpyW( p, Inf ); - strcatW( p, name ); - handle = CreateFileW( path, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0 ); - if (handle == INVALID_HANDLE_VALUE) - { - strcpyW( p, System32 ); - strcatW( p, name ); - handle = CreateFileW( path, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0 ); - } - } - - if (handle != INVALID_HANDLE_VALUE) - { - file = parse_file( handle, class, error ); - CloseHandle( handle ); - } - if (!file) - { - HeapFree( GetProcessHeap(), 0, path ); - return (HINF)INVALID_HANDLE_VALUE; - } - TRACE( "%s -> %p\n", debugstr_w(path), file ); - file->src_root = path; - if ((p = strrchrW( path, '\\' ))) p[1] = 0; /* remove file name */ - SetLastError( 0 ); - return (HINF)file; -} - - -/*********************************************************************** - * SetupOpenAppendInfFileA (SETUPAPI.@) - */ -BOOL WINAPI SetupOpenAppendInfFileA( PCSTR name, HINF parent_hinf, UINT *error ) -{ - HINF child_hinf; - - if (!name) return SetupOpenAppendInfFileW( NULL, parent_hinf, error ); - child_hinf = SetupOpenInfFileA( name, NULL, INF_STYLE_WIN4, error ); - if (child_hinf == (HINF)INVALID_HANDLE_VALUE) return FALSE; - append_inf_file( parent_hinf, child_hinf ); - TRACE( "%p: appended %s (%p)\n", parent_hinf, debugstr_a(name), child_hinf ); - return TRUE; -} - - -/*********************************************************************** - * SetupOpenAppendInfFileW (SETUPAPI.@) - */ -BOOL WINAPI SetupOpenAppendInfFileW( PCWSTR name, HINF parent_hinf, UINT *error ) -{ - HINF child_hinf; - - if (!name) - { - INFCONTEXT context; - WCHAR filename[MAX_PATH]; - int idx = 1; - - if (!SetupFindFirstLineW( parent_hinf, Version, LayoutFile, &context )) return FALSE; - while (SetupGetStringFieldW( &context, idx++, filename, - sizeof(filename)/sizeof(WCHAR), NULL )) - { - child_hinf = SetupOpenInfFileW( filename, NULL, INF_STYLE_WIN4, error ); - if (child_hinf == (HINF)INVALID_HANDLE_VALUE) return FALSE; - append_inf_file( parent_hinf, child_hinf ); - TRACE( "%p: appended %s (%p)\n", parent_hinf, debugstr_w(filename), child_hinf ); - } - return TRUE; - } - child_hinf = SetupOpenInfFileW( name, NULL, INF_STYLE_WIN4, error ); - if (child_hinf == (HINF)INVALID_HANDLE_VALUE) return FALSE; - append_inf_file( parent_hinf, child_hinf ); - TRACE( "%p: appended %s (%p)\n", parent_hinf, debugstr_w(name), child_hinf ); - return TRUE; -} - - -/*********************************************************************** - * SetupOpenMasterInf (SETUPAPI.@) - */ -HINF WINAPI SetupOpenMasterInf( VOID ) -{ - static const WCHAR Layout[] = {'\\','i','n','f','\\', 'l', 'a', 'y', 'o', 'u', 't', '.', 'i', 'n', 'f', 0}; - WCHAR Buffer[MAX_PATH]; - - GetWindowsDirectoryW( Buffer, MAX_PATH ); - - wcscat( Buffer, Layout ); - - return SetupOpenInfFileW( Buffer, NULL, INF_STYLE_WIN4, NULL); -} - - - -/*********************************************************************** - * SetupCloseInfFile (SETUPAPI.@) - */ -void WINAPI SetupCloseInfFile( HINF hinf ) -{ - struct inf_file *file = hinf; - int i; - - for (i = 0; i < file->nb_sections; i++) HeapFree( GetProcessHeap(), 0, file->sections[i] ); - HeapFree( GetProcessHeap(), 0, file->src_root ); - HeapFree( GetProcessHeap(), 0, file->sections ); - HeapFree( GetProcessHeap(), 0, file->fields ); - HeapFree( GetProcessHeap(), 0, file->strings ); - HeapFree( GetProcessHeap(), 0, file ); -} - - -/*********************************************************************** - * SetupGetLineCountA (SETUPAPI.@) - */ -LONG WINAPI SetupGetLineCountA( HINF hinf, PCSTR name ) -{ - UNICODE_STRING sectionW; - LONG ret = -1; - - if (!RtlCreateUnicodeStringFromAsciiz( §ionW, name )) - SetLastError( ERROR_NOT_ENOUGH_MEMORY ); - else - { - ret = SetupGetLineCountW( hinf, sectionW.Buffer ); - RtlFreeUnicodeString( §ionW ); - } - return ret; -} - - -/*********************************************************************** - * SetupGetLineCountW (SETUPAPI.@) - */ -LONG WINAPI SetupGetLineCountW( HINF hinf, PCWSTR section ) -{ - struct inf_file *file = hinf; - int section_index; - LONG ret = -1; - - for (file = hinf; file; file = file->next) - { - if ((section_index = find_section( file, section )) == -1) continue; - if (ret == -1) ret = 0; - ret += file->sections[section_index]->nb_lines; - } - TRACE( "(%p,%s) returning %ld\n", hinf, debugstr_w(section), ret ); - SetLastError( (ret == -1) ? ERROR_SECTION_NOT_FOUND : 0 ); - return ret; -} - - -/*********************************************************************** - * SetupGetLineByIndexA (SETUPAPI.@) - */ -BOOL WINAPI SetupGetLineByIndexA( HINF hinf, PCSTR section, DWORD index, INFCONTEXT *context ) -{ - UNICODE_STRING sectionW; - BOOL ret = FALSE; - - if (!RtlCreateUnicodeStringFromAsciiz( §ionW, section )) - SetLastError( ERROR_NOT_ENOUGH_MEMORY ); - else - { - ret = SetupGetLineByIndexW( hinf, sectionW.Buffer, index, context ); - RtlFreeUnicodeString( §ionW ); - } - return ret; -} - - -/*********************************************************************** - * SetupGetLineByIndexW (SETUPAPI.@) - */ -BOOL WINAPI SetupGetLineByIndexW( HINF hinf, PCWSTR section, DWORD index, INFCONTEXT *context ) -{ - struct inf_file *file = hinf; - int section_index; - - SetLastError( ERROR_SECTION_NOT_FOUND ); - for (file = hinf; file; file = file->next) - { - if ((section_index = find_section( file, section )) == -1) continue; - SetLastError( ERROR_LINE_NOT_FOUND ); - if (index < file->sections[section_index]->nb_lines) - { - context->Inf = hinf; - context->CurrentInf = file; - context->Section = section_index; - context->Line = index; - SetLastError( 0 ); - TRACE( "(%p,%s): returning %d/%ld\n", - hinf, debugstr_w(section), section_index, index ); - return TRUE; - } - index -= file->sections[section_index]->nb_lines; - } - TRACE( "(%p,%s) not found\n", hinf, debugstr_w(section) ); - return FALSE; -} - - -/*********************************************************************** - * SetupFindFirstLineA (SETUPAPI.@) - */ -BOOL WINAPI SetupFindFirstLineA( HINF hinf, PCSTR section, PCSTR key, INFCONTEXT *context ) -{ - UNICODE_STRING sectionW, keyW; - BOOL ret = FALSE; - - if (!RtlCreateUnicodeStringFromAsciiz( §ionW, section )) - { - SetLastError( ERROR_NOT_ENOUGH_MEMORY ); - return FALSE; - } - - if (!key) ret = SetupFindFirstLineW( hinf, sectionW.Buffer, NULL, context ); - else - { - if (RtlCreateUnicodeStringFromAsciiz( &keyW, key )) - { - ret = SetupFindFirstLineW( hinf, sectionW.Buffer, keyW.Buffer, context ); - RtlFreeUnicodeString( &keyW ); - } - else SetLastError( ERROR_NOT_ENOUGH_MEMORY ); - } - RtlFreeUnicodeString( §ionW ); - return ret; -} - - -/*********************************************************************** - * SetupFindFirstLineW (SETUPAPI.@) - */ -BOOL WINAPI SetupFindFirstLineW( HINF hinf, PCWSTR section, PCWSTR key, INFCONTEXT *context ) -{ - struct inf_file *file; - int section_index; - - SetLastError( ERROR_SECTION_NOT_FOUND ); - for (file = hinf; file; file = file->next) - { - if ((section_index = find_section( file, section )) == -1) continue; - if (key) - { - INFCONTEXT ctx; - ctx.Inf = hinf; - ctx.CurrentInf = file; - ctx.Section = section_index; - ctx.Line = -1; - return SetupFindNextMatchLineW( &ctx, key, context ); - } - SetLastError( ERROR_LINE_NOT_FOUND ); /* found at least one section */ - if (file->sections[section_index]->nb_lines) - { - context->Inf = hinf; - context->CurrentInf = file; - context->Section = section_index; - context->Line = 0; - SetLastError( 0 ); - TRACE( "(%p,%s,%s): returning %d/0\n", - hinf, debugstr_w(section), debugstr_w(key), section_index ); - return TRUE; - } - } - TRACE( "(%p,%s,%s): not found\n", hinf, debugstr_w(section), debugstr_w(key) ); - return FALSE; -} - - -/*********************************************************************** - * SetupFindNextLine (SETUPAPI.@) - */ -BOOL WINAPI SetupFindNextLine( PINFCONTEXT context_in, PINFCONTEXT context_out ) -{ - struct inf_file *file = context_in->CurrentInf; - struct section *section; - - if (context_in->Section >= file->nb_sections) goto error; - - section = file->sections[context_in->Section]; - if (context_in->Line+1 < section->nb_lines) - { - if (context_out != context_in) *context_out = *context_in; - context_out->Line++; - SetLastError( 0 ); - return TRUE; - } - - /* now search the appended files */ - - for (file = file->next; file; file = file->next) - { - int section_index = find_section( file, section->name ); - if (section_index == -1) continue; - if (file->sections[section_index]->nb_lines) - { - context_out->Inf = context_in->Inf; - context_out->CurrentInf = file; - context_out->Section = section_index; - context_out->Line = 0; - SetLastError( 0 ); - return TRUE; - } - } - error: - SetLastError( ERROR_LINE_NOT_FOUND ); - return FALSE; -} - - -/*********************************************************************** - * SetupFindNextMatchLineA (SETUPAPI.@) - */ -BOOL WINAPI SetupFindNextMatchLineA( PINFCONTEXT context_in, PCSTR key, - PINFCONTEXT context_out ) -{ - UNICODE_STRING keyW; - BOOL ret = FALSE; - - if (!key) return SetupFindNextLine( context_in, context_out ); - - if (!RtlCreateUnicodeStringFromAsciiz( &keyW, key )) - SetLastError( ERROR_NOT_ENOUGH_MEMORY ); - else - { - ret = SetupFindNextMatchLineW( context_in, keyW.Buffer, context_out ); - RtlFreeUnicodeString( &keyW ); - } - return ret; -} - - -/*********************************************************************** - * SetupFindNextMatchLineW (SETUPAPI.@) - */ -BOOL WINAPI SetupFindNextMatchLineW( PINFCONTEXT context_in, PCWSTR key, - PINFCONTEXT context_out ) -{ - struct inf_file *file = context_in->CurrentInf; - struct section *section; - struct line *line; - unsigned int i; - - if (!key) return SetupFindNextLine( context_in, context_out ); - - if (context_in->Section >= file->nb_sections) goto error; - - section = file->sections[context_in->Section]; - - for (i = context_in->Line+1, line = §ion->lines[i]; i < section->nb_lines; i++, line++) - { - if (line->key_field == -1) continue; - if (!strcmpiW( key, file->fields[line->key_field].text )) - { - if (context_out != context_in) *context_out = *context_in; - context_out->Line = i; - SetLastError( 0 ); - TRACE( "(%p,%s,%s): returning %d\n", - file, debugstr_w(section->name), debugstr_w(key), i ); - return TRUE; - } - } - - /* now search the appended files */ - - for (file = file->next; file; file = file->next) - { - int section_index = find_section( file, section->name ); - if (section_index == -1) continue; - section = file->sections[section_index]; - for (i = 0, line = section->lines; i < section->nb_lines; i++, line++) - { - if (line->key_field == -1) continue; - if (!strcmpiW( key, file->fields[line->key_field].text )) - { - context_out->Inf = context_in->Inf; - context_out->CurrentInf = file; - context_out->Section = section_index; - context_out->Line = i; - SetLastError( 0 ); - TRACE( "(%p,%s,%s): returning %d/%d\n", - file, debugstr_w(section->name), debugstr_w(key), section_index, i ); - return TRUE; - } - } - } - TRACE( "(%p,%s,%s): not found\n", - context_in->CurrentInf, debugstr_w(section->name), debugstr_w(key) ); - error: - SetLastError( ERROR_LINE_NOT_FOUND ); - return FALSE; -} - - -/*********************************************************************** - * SetupGetLineTextW (SETUPAPI.@) - */ -BOOL WINAPI SetupGetLineTextW( PINFCONTEXT context, HINF hinf, PCWSTR section_name, - PCWSTR key_name, PWSTR buffer, DWORD size, PDWORD required ) -{ - struct inf_file *file; - struct line *line; - struct field *field; - int i; - DWORD total = 0; - - if (!context) - { - INFCONTEXT new_context; - if (!SetupFindFirstLineW( hinf, section_name, key_name, &new_context )) return FALSE; - file = new_context.CurrentInf; - line = get_line( file, new_context.Section, new_context.Line ); - } - else - { - file = context->CurrentInf; - if (!(line = get_line( file, context->Section, context->Line ))) - { - SetLastError( ERROR_LINE_NOT_FOUND ); - return FALSE; - } - } - - for (i = 0, field = &file->fields[line->first_field]; i < line->nb_fields; i++, field++) - total += PARSER_string_substW( file, field->text, NULL, 0 ) + 1; - - if (required) *required = total; - if (buffer) - { - if (total > size) - { - SetLastError( ERROR_INSUFFICIENT_BUFFER ); - return FALSE; - } - for (i = 0, field = &file->fields[line->first_field]; i < line->nb_fields; i++, field++) - { - unsigned int len = PARSER_string_substW( file, field->text, buffer, size ); - if (i+1 < line->nb_fields) buffer[len] = ','; - buffer += len + 1; - } - } - return TRUE; -} - - -/*********************************************************************** - * SetupGetLineTextA (SETUPAPI.@) - */ -BOOL WINAPI SetupGetLineTextA( PINFCONTEXT context, HINF hinf, PCSTR section_name, - PCSTR key_name, PSTR buffer, DWORD size, PDWORD required ) -{ - struct inf_file *file; - struct line *line; - struct field *field; - int i; - DWORD total = 0; - - if (!context) - { - INFCONTEXT new_context; - if (!SetupFindFirstLineA( hinf, section_name, key_name, &new_context )) return FALSE; - file = new_context.CurrentInf; - line = get_line( file, new_context.Section, new_context.Line ); - } - else - { - file = context->CurrentInf; - if (!(line = get_line( file, context->Section, context->Line ))) - { - SetLastError( ERROR_LINE_NOT_FOUND ); - return FALSE; - } - } - - for (i = 0, field = &file->fields[line->first_field]; i < line->nb_fields; i++, field++) - total += PARSER_string_substA( file, field->text, NULL, 0 ) + 1; - - if (required) *required = total; - if (buffer) - { - if (total > size) - { - SetLastError( ERROR_INSUFFICIENT_BUFFER ); - return FALSE; - } - for (i = 0, field = &file->fields[line->first_field]; i < line->nb_fields; i++, field++) - { - unsigned int len = PARSER_string_substA( file, field->text, buffer, size ); - if (i+1 < line->nb_fields) buffer[len] = ','; - buffer += len + 1; - } - } - return TRUE; -} - - -/*********************************************************************** - * SetupGetFieldCount (SETUPAPI.@) - */ -DWORD WINAPI SetupGetFieldCount( PINFCONTEXT context ) -{ - struct inf_file *file = context->CurrentInf; - struct line *line = get_line( file, context->Section, context->Line ); - - if (!line) return 0; - return line->nb_fields; -} - - -/*********************************************************************** - * SetupGetStringFieldA (SETUPAPI.@) - */ -BOOL WINAPI SetupGetStringFieldA( PINFCONTEXT context, DWORD index, PSTR buffer, - DWORD size, PDWORD required ) -{ - struct inf_file *file = context->CurrentInf; - struct field *field = get_field( file, context->Section, context->Line, index ); - unsigned int len; - - SetLastError(0); - if (!field) return FALSE; - len = PARSER_string_substA( file, field->text, NULL, 0 ); - if (required) *required = len + 1; - if (buffer) - { - if (size <= len) - { - SetLastError( ERROR_INSUFFICIENT_BUFFER ); - return FALSE; - } - PARSER_string_substA( file, field->text, buffer, size ); - - TRACE( "context %p/%p/%d/%d index %ld returning %s\n", - context->Inf, context->CurrentInf, context->Section, context->Line, - index, debugstr_a(buffer) ); - } - return TRUE; -} - - -/*********************************************************************** - * SetupGetStringFieldW (SETUPAPI.@) - */ -BOOL WINAPI SetupGetStringFieldW( PINFCONTEXT context, DWORD index, PWSTR buffer, - DWORD size, PDWORD required ) -{ - struct inf_file *file = context->CurrentInf; - struct field *field = get_field( file, context->Section, context->Line, index ); - unsigned int len; - - SetLastError(0); - if (!field) return FALSE; - len = PARSER_string_substW( file, field->text, NULL, 0 ); - if (required) *required = len + 1; - if (buffer) - { - if (size <= len) - { - SetLastError( ERROR_INSUFFICIENT_BUFFER ); - return FALSE; - } - PARSER_string_substW( file, field->text, buffer, size ); - - TRACE( "context %p/%p/%d/%d index %ld returning %s\n", - context->Inf, context->CurrentInf, context->Section, context->Line, - index, debugstr_w(buffer) ); - } - return TRUE; -} - - -/*********************************************************************** - * SetupGetIntField (SETUPAPI.@) - */ -BOOL WINAPI SetupGetIntField( PINFCONTEXT context, DWORD index, PINT result ) -{ - char localbuff[20]; - char *end, *buffer = localbuff; - DWORD required; - INT res; - BOOL ret = FALSE; - - if (!SetupGetStringFieldA( context, index, localbuff, sizeof(localbuff), &required )) - { - if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) return FALSE; - if (!(buffer = HeapAlloc( GetProcessHeap(), 0, required ))) return FALSE; - if (!SetupGetStringFieldA( context, index, buffer, required, NULL )) goto done; - } - res = strtol( buffer, &end, 0 ); - if (end != buffer && !*end) - { - *result = res; - ret = TRUE; - } - else SetLastError( ERROR_INVALID_DATA ); - - done: - if (buffer != localbuff) HeapFree( GetProcessHeap(), 0, buffer ); - return ret; -} - - -/*********************************************************************** - * SetupGetBinaryField (SETUPAPI.@) - */ -BOOL WINAPI SetupGetBinaryField( PINFCONTEXT context, DWORD index, BYTE *buffer, - DWORD size, LPDWORD required ) -{ - struct inf_file *file = context->CurrentInf; - struct line *line = get_line( file, context->Section, context->Line ); - struct field *field; - int i; - - if (!line) - { - SetLastError( ERROR_LINE_NOT_FOUND ); - return FALSE; - } - if (!index || index >= line->nb_fields) - { - SetLastError( ERROR_INVALID_PARAMETER ); - return FALSE; - } - index--; /* fields start at 0 */ - if (required) *required = line->nb_fields - index; - if (!buffer) return TRUE; - if (size < line->nb_fields - index) - { - SetLastError( ERROR_INSUFFICIENT_BUFFER ); - return FALSE; - } - field = &file->fields[line->first_field + index]; - for (i = index; i < line->nb_fields; i++, field++) - { - const WCHAR *p; - DWORD value = 0; - for (p = field->text; *p && isxdigitW(*p); p++) - { - if ((value <<= 4) > 255) - { - SetLastError( ERROR_INVALID_DATA ); - return FALSE; - } - if (*p <= '9') value |= (*p - '0'); - else value |= (tolowerW(*p) - 'a' + 10); - } - buffer[i - index] = value; - } - if (TRACE_ON(setupapi)) - { - TRACE( "%p/%p/%d/%d index %ld returning", - context->Inf, context->CurrentInf, context->Section, context->Line, index ); - for (i = index; i < line->nb_fields; i++) TRACE( " %02x", buffer[i - index] ); - TRACE( "\n" ); - } - return TRUE; -} - - -/*********************************************************************** - * SetupGetMultiSzFieldA (SETUPAPI.@) - */ -BOOL WINAPI SetupGetMultiSzFieldA( PINFCONTEXT context, DWORD index, PSTR buffer, - DWORD size, LPDWORD required ) -{ - struct inf_file *file = context->CurrentInf; - struct line *line = get_line( file, context->Section, context->Line ); - struct field *field; - unsigned int len; - int i; - DWORD total = 1; - - if (!line) - { - SetLastError( ERROR_LINE_NOT_FOUND ); - return FALSE; - } - if (!index || index >= line->nb_fields) - { - SetLastError( ERROR_INVALID_PARAMETER ); - return FALSE; - } - index--; /* fields start at 0 */ - field = &file->fields[line->first_field + index]; - for (i = index; i < line->nb_fields; i++, field++) - { - if (!(len = PARSER_string_substA( file, field->text, NULL, 0 ))) break; - total += len + 1; - } - - if (required) *required = total; - if (!buffer) return TRUE; - if (total > size) - { - SetLastError( ERROR_INSUFFICIENT_BUFFER ); - return FALSE; - } - field = &file->fields[line->first_field + index]; - for (i = index; i < line->nb_fields; i++, field++) - { - if (!(len = PARSER_string_substA( file, field->text, buffer, size ))) break; - buffer += len + 1; - } - *buffer = 0; /* add final null */ - return TRUE; -} - - -/*********************************************************************** - * SetupGetMultiSzFieldW (SETUPAPI.@) - */ -BOOL WINAPI SetupGetMultiSzFieldW( PINFCONTEXT context, DWORD index, PWSTR buffer, - DWORD size, LPDWORD required ) -{ - struct inf_file *file = context->CurrentInf; - struct line *line = get_line( file, context->Section, context->Line ); - struct field *field; - unsigned int len; - int i; - DWORD total = 1; - - if (!line) - { - SetLastError( ERROR_LINE_NOT_FOUND ); - return FALSE; - } - if (!index || index >= line->nb_fields) - { - SetLastError( ERROR_INVALID_PARAMETER ); - return FALSE; - } - index--; /* fields start at 0 */ - field = &file->fields[line->first_field + index]; - for (i = index; i < line->nb_fields; i++, field++) - { - if (!(len = PARSER_string_substW( file, field->text, NULL, 0 ))) break; - total += len + 1; - } - - if (required) *required = total; - if (!buffer) return TRUE; - if (total > size) - { - SetLastError( ERROR_INSUFFICIENT_BUFFER ); - return FALSE; - } - field = &file->fields[line->first_field + index]; - for (i = index; i < line->nb_fields; i++, field++) - { - if (!(len = PARSER_string_substW( file, field->text, buffer, size ))) break; - buffer += len + 1; - } - *buffer = 0; /* add final null */ - return TRUE; -} diff --git a/reactos/lib/setupapi/queue.c b/reactos/lib/setupapi/queue.c deleted file mode 100644 index 7e82d376353..00000000000 --- a/reactos/lib/setupapi/queue.c +++ /dev/null @@ -1,1375 +0,0 @@ -/* - * Setupapi file queue routines - * - * Copyright 2002 Alexandre Julliard for CodeWeavers - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include - -#include "windef.h" -#include "winbase.h" -#include "winreg.h" -#include "winternl.h" -#include "winerror.h" -#include "wingdi.h" -#include "winuser.h" -#include "winnls.h" -#include "setupapi.h" -#include "wine/unicode.h" -#include "setupapi_private.h" -#include "winver.h" -#include "wine/debug.h" - -WINE_DEFAULT_DEBUG_CHANNEL(setupapi); - -/* context structure for the default queue callback */ -struct default_callback_context -{ - HWND owner; - HWND progress; - UINT message; -}; - -struct file_op -{ - struct file_op *next; - UINT style; - WCHAR *src_root; - WCHAR *src_path; - WCHAR *src_file; - WCHAR *src_descr; - WCHAR *src_tag; - WCHAR *dst_path; - WCHAR *dst_file; -}; - -struct file_op_queue -{ - struct file_op *head; - struct file_op *tail; - unsigned int count; -}; - -struct file_queue -{ - struct file_op_queue copy_queue; - struct file_op_queue delete_queue; - struct file_op_queue rename_queue; - DWORD flags; -}; - - -inline static WCHAR *strdupW( const WCHAR *str ) -{ - WCHAR *ret = NULL; - if (str) - { - int len = (strlenW(str) + 1) * sizeof(WCHAR); - if ((ret = HeapAlloc( GetProcessHeap(), 0, len ))) memcpy( ret, str, len ); - } - return ret; -} - - -inline static WCHAR *strdupAtoW( const char *str ) -{ - WCHAR *ret = NULL; - if (str) - { - DWORD len = MultiByteToWideChar( CP_ACP, 0, str, -1, NULL, 0 ); - if ((ret = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) ))) - MultiByteToWideChar( CP_ACP, 0, str, -1, ret, len ); - } - return ret; -} - -inline static char *strdupWtoA( const WCHAR *str ) -{ - char *ret = NULL; - if (str) - { - DWORD len = WideCharToMultiByte( CP_ACP, 0, str, -1, NULL, 0, NULL, NULL ); - if ((ret = HeapAlloc( GetProcessHeap(), 0, len ))) - WideCharToMultiByte( CP_ACP, 0, str, -1, ret, len, NULL, NULL ); - } - return ret; -} - -/* append a file operation to a queue */ -inline static void queue_file_op( struct file_op_queue *queue, struct file_op *op ) -{ - op->next = NULL; - if (queue->tail) queue->tail->next = op; - else queue->head = op; - queue->tail = op; - queue->count++; -} - -/* free all the file operations on a given queue */ -static void free_file_op_queue( struct file_op_queue *queue ) -{ - struct file_op *t, *op = queue->head; - - while( op ) - { - HeapFree( GetProcessHeap(), 0, op->src_root ); - HeapFree( GetProcessHeap(), 0, op->src_path ); - HeapFree( GetProcessHeap(), 0, op->src_file ); - HeapFree( GetProcessHeap(), 0, op->src_descr ); - HeapFree( GetProcessHeap(), 0, op->src_tag ); - HeapFree( GetProcessHeap(), 0, op->dst_path ); - if (op->dst_file != op->src_file) HeapFree( GetProcessHeap(), 0, op->dst_file ); - t = op; - op = op->next; - HeapFree( GetProcessHeap(), 0, t ); - } -} - -/* concat 3 strings to make a path, handling separators correctly */ -static void concat_W( WCHAR *buffer, const WCHAR *src1, const WCHAR *src2, const WCHAR *src3 ) -{ - *buffer = 0; - if (src1 && *src1) - { - strcpyW( buffer, src1 ); - buffer += strlenW(buffer ); - if (buffer[-1] != '\\') *buffer++ = '\\'; - if (src2) while (*src2 == '\\') src2++; - } - - if (src2) - { - strcpyW( buffer, src2 ); - buffer += strlenW(buffer ); - if (buffer[-1] != '\\') *buffer++ = '\\'; - if (src3) while (*src3 == '\\') src3++; - } - if (src3) - { - strcpyW( buffer, src3 ); - buffer += strlenW(buffer ); - } -} - - -/*********************************************************************** - * build_filepathsW - * - * Build a FILEPATHS_W structure for a given file operation. - */ -static BOOL build_filepathsW( const struct file_op *op, FILEPATHS_W *paths ) -{ - int src_len = 1, dst_len = 1; - WCHAR *source = (PWSTR)paths->Source, *target = (PWSTR)paths->Target; - - if (op->src_root) src_len += strlenW(op->src_root) + 1; - if (op->src_path) src_len += strlenW(op->src_path) + 1; - if (op->src_file) src_len += strlenW(op->src_file) + 1; - if (op->dst_path) dst_len += strlenW(op->dst_path) + 1; - if (op->dst_file) dst_len += strlenW(op->dst_file) + 1; - src_len *= sizeof(WCHAR); - dst_len *= sizeof(WCHAR); - - if (!source || HeapSize( GetProcessHeap(), 0, source ) < src_len ) - { - HeapFree( GetProcessHeap(), 0, source ); - paths->Source = source = HeapAlloc( GetProcessHeap(), 0, src_len ); - } - if (!target || HeapSize( GetProcessHeap(), 0, target ) < dst_len ) - { - HeapFree( GetProcessHeap(), 0, target ); - paths->Target = target = HeapAlloc( GetProcessHeap(), 0, dst_len ); - } - if (!source || !target) return FALSE; - concat_W( source, op->src_root, op->src_path, op->src_file ); - concat_W( target, NULL, op->dst_path, op->dst_file ); - paths->Win32Error = 0; - paths->Flags = 0; - return TRUE; -} - - -/*********************************************************************** - * QUEUE_callback_WtoA - * - * Map a file callback parameters from W to A and call the A callback. - */ -UINT CALLBACK QUEUE_callback_WtoA( void *context, UINT notification, - UINT_PTR param1, UINT_PTR param2 ) -{ - struct callback_WtoA_context *callback_ctx = context; - char buffer[MAX_PATH]; - UINT ret; - UINT_PTR old_param2 = param2; - - switch(notification) - { - case SPFILENOTIFY_COPYERROR: - param2 = (UINT_PTR)&buffer; - /* fall through */ - case SPFILENOTIFY_STARTDELETE: - case SPFILENOTIFY_ENDDELETE: - case SPFILENOTIFY_DELETEERROR: - case SPFILENOTIFY_STARTRENAME: - case SPFILENOTIFY_ENDRENAME: - case SPFILENOTIFY_RENAMEERROR: - case SPFILENOTIFY_STARTCOPY: - case SPFILENOTIFY_ENDCOPY: - { - FILEPATHS_W *pathsW = (FILEPATHS_W *)param1; - FILEPATHS_A pathsA; - - pathsA.Source = strdupWtoA( pathsW->Source ); - pathsA.Target = strdupWtoA( pathsW->Target ); - pathsA.Win32Error = pathsW->Win32Error; - pathsA.Flags = pathsW->Flags; - ret = callback_ctx->orig_handler( callback_ctx->orig_context, notification, - (UINT_PTR)&pathsA, param2 ); - HeapFree( GetProcessHeap(), 0, (void *)pathsA.Source ); - HeapFree( GetProcessHeap(), 0, (void *)pathsA.Target ); - } - if (notification == SPFILENOTIFY_COPYERROR) - MultiByteToWideChar( CP_ACP, 0, buffer, -1, (WCHAR *)old_param2, MAX_PATH ); - break; - - case SPFILENOTIFY_STARTREGISTRATION: - case SPFILENOTIFY_ENDREGISTRATION: - { - SP_REGISTER_CONTROL_STATUSW *statusW = (SP_REGISTER_CONTROL_STATUSW *)param1; - SP_REGISTER_CONTROL_STATUSA statusA; - - statusA.cbSize = sizeof(statusA); - statusA.FileName = strdupWtoA( statusW->FileName ); - statusA.Win32Error = statusW->Win32Error; - statusA.FailureCode = statusW->FailureCode; - ret = callback_ctx->orig_handler( callback_ctx->orig_context, notification, - (UINT_PTR)&statusA, param2 ); - HeapFree( GetProcessHeap(), 0, (LPSTR)statusA.FileName ); - } - break; - - case SPFILENOTIFY_NEEDMEDIA: - case SPFILENOTIFY_QUEUESCAN: - FIXME("mapping for %d not implemented\n",notification); - case SPFILENOTIFY_STARTQUEUE: - case SPFILENOTIFY_ENDQUEUE: - case SPFILENOTIFY_STARTSUBQUEUE: - case SPFILENOTIFY_ENDSUBQUEUE: - default: - ret = callback_ctx->orig_handler( callback_ctx->orig_context, notification, param1, param2 ); - break; - } - return ret; -} - - -/*********************************************************************** - * get_src_file_info - * - * Retrieve the source file information for a given file. - */ -static void get_src_file_info( HINF hinf, struct file_op *op ) -{ - static const WCHAR SourceDisksNames[] = - {'S','o','u','r','c','e','D','i','s','k','s','N','a','m','e','s',0}; - static const WCHAR SourceDisksFiles[] = - {'S','o','u','r','c','e','D','i','s','k','s','F','i','l','e','s',0}; - - INFCONTEXT file_ctx, disk_ctx; - INT id, diskid; - DWORD len, len2; - - /* find the SourceDisksFiles entry */ - if (!SetupFindFirstLineW( hinf, SourceDisksFiles, op->src_file, &file_ctx )) - { - const WCHAR *dir; - - if ((op->style & (SP_COPY_SOURCE_ABSOLUTE|SP_COPY_SOURCEPATH_ABSOLUTE))) return; - /* no specific info, use .inf file source directory */ - if (!op->src_root && (dir = DIRID_get_string( hinf, DIRID_SRCPATH ))) - op->src_root = strdupW( dir ); - return; - } - if (!SetupGetIntField( &file_ctx, 1, &diskid )) return; - - /* now find the diskid in the SourceDisksNames section */ - if (!SetupFindFirstLineW( hinf, SourceDisksNames, NULL, &disk_ctx )) return; - for (;;) - { - if (SetupGetIntField( &disk_ctx, 0, &id ) && (id == diskid)) break; - if (!SetupFindNextLine( &disk_ctx, &disk_ctx )) return; - } - - /* and fill in the missing info */ - - if (!op->src_descr) - { - if (SetupGetStringFieldW( &disk_ctx, 1, NULL, 0, &len ) && - (op->src_descr = HeapAlloc( GetProcessHeap(), 0, len*sizeof(WCHAR) ))) - SetupGetStringFieldW( &disk_ctx, 1, op->src_descr, len, NULL ); - } - if (!op->src_tag) - { - if (SetupGetStringFieldW( &disk_ctx, 2, NULL, 0, &len ) && - (op->src_tag = HeapAlloc( GetProcessHeap(), 0, len*sizeof(WCHAR) ))) - SetupGetStringFieldW( &disk_ctx, 2, op->src_tag, len, NULL ); - } - if (!op->src_path && !(op->style & SP_COPY_SOURCE_ABSOLUTE)) - { - if (!(op->style & SP_COPY_SOURCEPATH_ABSOLUTE)) - { - /* retrieve relative path for this disk */ - if (!SetupGetStringFieldW( &disk_ctx, 4, NULL, 0, &len )) len = 0; - } - /* retrieve relative path for this file */ - if (!SetupGetStringFieldW( &file_ctx, 2, NULL, 0, &len2 )) len2 = 0; - - if ((len || len2) && - (op->src_path = HeapAlloc( GetProcessHeap(), 0, (len+len2)*sizeof(WCHAR) ))) - { - WCHAR *ptr = op->src_path; - if (len) - { - SetupGetStringFieldW( &disk_ctx, 4, op->src_path, len, NULL ); - ptr = op->src_path + strlenW(op->src_path); - if (len2 && ptr > op->src_path && ptr[-1] != '\\') *ptr++ = '\\'; - } - if (!SetupGetStringFieldW( &disk_ctx, 4, ptr, len2, NULL )) *ptr = 0; - } - } - if (!op->src_root) op->src_root = strdupW( PARSER_get_src_root(hinf) ); -} - - -/*********************************************************************** - * get_destination_dir - * - * Retrieve the destination dir for a given section. - */ -static WCHAR *get_destination_dir( HINF hinf, const WCHAR *section ) -{ - static const WCHAR Dest[] = {'D','e','s','t','i','n','a','t','i','o','n','D','i','r','s',0}; - static const WCHAR Def[] = {'D','e','f','a','u','l','t','D','e','s','t','D','i','r',0}; - INFCONTEXT context; - - if (!SetupFindFirstLineW( hinf, Dest, section, &context ) && - !SetupFindFirstLineW( hinf, Dest, Def, &context )) return NULL; - return PARSER_get_dest_dir( &context ); -} - - -static void (WINAPI *pExtractFiles)( LPSTR, LPSTR, DWORD, DWORD, DWORD, DWORD ); - -/*********************************************************************** - * extract_cabinet_file - * - * Extract a file from a .cab file. - */ -static BOOL extract_cabinet_file( const WCHAR *cabinet, const WCHAR *root, - const WCHAR *src, const WCHAR *dst ) -{ - static const WCHAR extW[] = {'.','c','a','b',0}; - static HMODULE advpack; - - char *cab_path, *cab_file; - int len = strlenW( cabinet ); - - /* make sure the cabinet file has a .cab extension */ - if (len <= 4 || strcmpiW( cabinet + len - 4, extW )) return FALSE; - if (!pExtractFiles) - { - if (!advpack && !(advpack = LoadLibraryA( "advpack.dll" ))) - { - ERR( "could not load advpack.dll\n" ); - return FALSE; - } - if (!(pExtractFiles = (void *)GetProcAddress( advpack, "ExtractFiles" ))) - { - ERR( "could not find ExtractFiles in advpack.dll\n" ); - return FALSE; - } - } - - if (!(cab_path = strdupWtoA( root ))) return FALSE; - len = WideCharToMultiByte( CP_ACP, 0, cabinet, -1, NULL, 0, NULL, NULL ); - if (!(cab_file = HeapAlloc( GetProcessHeap(), 0, strlen(cab_path) + len + 1 ))) - { - HeapFree( GetProcessHeap(), 0, cab_path ); - return FALSE; - } - strcpy( cab_file, cab_path ); - if (cab_file[0] && cab_file[strlen(cab_file)-1] != '\\') strcat( cab_file, "\\" ); - WideCharToMultiByte( CP_ACP, 0, cabinet, -1, cab_file + strlen(cab_file), len, NULL, NULL ); - FIXME( "awful hack: extracting cabinet %s\n", debugstr_a(cab_file) ); - pExtractFiles( cab_file, cab_path, 0, 0, 0, 0 ); - HeapFree( GetProcessHeap(), 0, cab_file ); - HeapFree( GetProcessHeap(), 0, cab_path ); - return CopyFileW( src, dst, FALSE /*FIXME*/ ); -} - - -/*********************************************************************** - * SetupOpenFileQueue (SETUPAPI.@) - */ -HSPFILEQ WINAPI SetupOpenFileQueue(void) -{ - struct file_queue *queue; - - if (!(queue = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*queue)))) - return (HSPFILEQ)INVALID_HANDLE_VALUE; - return queue; -} - - -/*********************************************************************** - * SetupCloseFileQueue (SETUPAPI.@) - */ -BOOL WINAPI SetupCloseFileQueue( HSPFILEQ handle ) -{ - struct file_queue *queue = handle; - - free_file_op_queue( &queue->copy_queue ); - free_file_op_queue( &queue->rename_queue ); - free_file_op_queue( &queue->delete_queue ); - HeapFree( GetProcessHeap(), 0, queue ); - return TRUE; -} - - -/*********************************************************************** - * SetupQueueCopyIndirectA (SETUPAPI.@) - */ -BOOL WINAPI SetupQueueCopyIndirectA( PSP_FILE_COPY_PARAMS_A params ) -{ - struct file_queue *queue = params->QueueHandle; - struct file_op *op; - - if (!(op = HeapAlloc( GetProcessHeap(), 0, sizeof(*op) ))) return FALSE; - op->style = params->CopyStyle; - op->src_root = strdupAtoW( params->SourceRootPath ); - op->src_path = strdupAtoW( params->SourcePath ); - op->src_file = strdupAtoW( params->SourceFilename ); - op->src_descr = strdupAtoW( params->SourceDescription ); - op->src_tag = strdupAtoW( params->SourceTagfile ); - op->dst_path = strdupAtoW( params->TargetDirectory ); - op->dst_file = strdupAtoW( params->TargetFilename ); - - /* some defaults */ - if (!op->src_file) op->src_file = op->dst_file; - if (params->LayoutInf) - { - get_src_file_info( params->LayoutInf, op ); - if (!op->dst_path) op->dst_path = get_destination_dir( params->LayoutInf, op->dst_file ); - } - - TRACE( "root=%s path=%s file=%s -> dir=%s file=%s descr=%s tag=%s\n", - debugstr_w(op->src_root), debugstr_w(op->src_path), debugstr_w(op->src_file), - debugstr_w(op->dst_path), debugstr_w(op->dst_file), - debugstr_w(op->src_descr), debugstr_w(op->src_tag) ); - - queue_file_op( &queue->copy_queue, op ); - return TRUE; -} - - -/*********************************************************************** - * SetupQueueCopyIndirectW (SETUPAPI.@) - */ -BOOL WINAPI SetupQueueCopyIndirectW( PSP_FILE_COPY_PARAMS_W params ) -{ - struct file_queue *queue = params->QueueHandle; - struct file_op *op; - - if (!(op = HeapAlloc( GetProcessHeap(), 0, sizeof(*op) ))) return FALSE; - op->style = params->CopyStyle; - op->src_root = strdupW( params->SourceRootPath ); - op->src_path = strdupW( params->SourcePath ); - op->src_file = strdupW( params->SourceFilename ); - op->src_descr = strdupW( params->SourceDescription ); - op->src_tag = strdupW( params->SourceTagfile ); - op->dst_path = strdupW( params->TargetDirectory ); - op->dst_file = strdupW( params->TargetFilename ); - - /* some defaults */ - if (!op->src_file) op->src_file = op->dst_file; - if (params->LayoutInf) - { - get_src_file_info( params->LayoutInf, op ); - if (!op->dst_path) op->dst_path = get_destination_dir( params->LayoutInf, op->dst_file ); - } - - TRACE( "root=%s path=%s file=%s -> dir=%s file=%s descr=%s tag=%s\n", - debugstr_w(op->src_root), debugstr_w(op->src_path), debugstr_w(op->src_file), - debugstr_w(op->dst_path), debugstr_w(op->dst_file), - debugstr_w(op->src_descr), debugstr_w(op->src_tag) ); - - queue_file_op( &queue->copy_queue, op ); - return TRUE; -} - - -/*********************************************************************** - * SetupQueueCopyA (SETUPAPI.@) - */ -BOOL WINAPI SetupQueueCopyA( HSPFILEQ queue, PCSTR src_root, PCSTR src_path, PCSTR src_file, - PCSTR src_descr, PCSTR src_tag, PCSTR dst_dir, PCSTR dst_file, - DWORD style ) -{ - SP_FILE_COPY_PARAMS_A params; - - params.cbSize = sizeof(params); - params.QueueHandle = queue; - params.SourceRootPath = src_root; - params.SourcePath = src_path; - params.SourceFilename = src_file; - params.SourceDescription = src_descr; - params.SourceTagfile = src_tag; - params.TargetDirectory = dst_dir; - params.TargetFilename = dst_file; - params.CopyStyle = style; - params.LayoutInf = 0; - params.SecurityDescriptor = NULL; - return SetupQueueCopyIndirectA( ¶ms ); -} - - -/*********************************************************************** - * SetupQueueCopyW (SETUPAPI.@) - */ -BOOL WINAPI SetupQueueCopyW( HSPFILEQ queue, PCWSTR src_root, PCWSTR src_path, PCWSTR src_file, - PCWSTR src_descr, PCWSTR src_tag, PCWSTR dst_dir, PCWSTR dst_file, - DWORD style ) -{ - SP_FILE_COPY_PARAMS_W params; - - params.cbSize = sizeof(params); - params.QueueHandle = queue; - params.SourceRootPath = src_root; - params.SourcePath = src_path; - params.SourceFilename = src_file; - params.SourceDescription = src_descr; - params.SourceTagfile = src_tag; - params.TargetDirectory = dst_dir; - params.TargetFilename = dst_file; - params.CopyStyle = style; - params.LayoutInf = 0; - params.SecurityDescriptor = NULL; - return SetupQueueCopyIndirectW( ¶ms ); -} - - -/*********************************************************************** - * SetupQueueDefaultCopyA (SETUPAPI.@) - */ -BOOL WINAPI SetupQueueDefaultCopyA( HSPFILEQ queue, HINF hinf, PCSTR src_root, PCSTR src_file, - PCSTR dst_file, DWORD style ) -{ - SP_FILE_COPY_PARAMS_A params; - - params.cbSize = sizeof(params); - params.QueueHandle = queue; - params.SourceRootPath = src_root; - params.SourcePath = NULL; - params.SourceFilename = src_file; - params.SourceDescription = NULL; - params.SourceTagfile = NULL; - params.TargetDirectory = NULL; - params.TargetFilename = dst_file; - params.CopyStyle = style; - params.LayoutInf = hinf; - params.SecurityDescriptor = NULL; - return SetupQueueCopyIndirectA( ¶ms ); -} - - -/*********************************************************************** - * SetupQueueDefaultCopyW (SETUPAPI.@) - */ -BOOL WINAPI SetupQueueDefaultCopyW( HSPFILEQ queue, HINF hinf, PCWSTR src_root, PCWSTR src_file, - PCWSTR dst_file, DWORD style ) -{ - SP_FILE_COPY_PARAMS_W params; - - params.cbSize = sizeof(params); - params.QueueHandle = queue; - params.SourceRootPath = src_root; - params.SourcePath = NULL; - params.SourceFilename = src_file; - params.SourceDescription = NULL; - params.SourceTagfile = NULL; - params.TargetDirectory = NULL; - params.TargetFilename = dst_file; - params.CopyStyle = style; - params.LayoutInf = hinf; - params.SecurityDescriptor = NULL; - return SetupQueueCopyIndirectW( ¶ms ); -} - - -/*********************************************************************** - * SetupQueueDeleteA (SETUPAPI.@) - */ -BOOL WINAPI SetupQueueDeleteA( HSPFILEQ handle, PCSTR part1, PCSTR part2 ) -{ - struct file_queue *queue = handle; - struct file_op *op; - - if (!(op = HeapAlloc( GetProcessHeap(), 0, sizeof(*op) ))) return FALSE; - op->style = 0; - op->src_root = NULL; - op->src_path = NULL; - op->src_file = NULL; - op->src_descr = NULL; - op->src_tag = NULL; - op->dst_path = strdupAtoW( part1 ); - op->dst_file = strdupAtoW( part2 ); - queue_file_op( &queue->delete_queue, op ); - return TRUE; -} - - -/*********************************************************************** - * SetupQueueDeleteW (SETUPAPI.@) - */ -BOOL WINAPI SetupQueueDeleteW( HSPFILEQ handle, PCWSTR part1, PCWSTR part2 ) -{ - struct file_queue *queue = handle; - struct file_op *op; - - if (!(op = HeapAlloc( GetProcessHeap(), 0, sizeof(*op) ))) return FALSE; - op->style = 0; - op->src_root = NULL; - op->src_path = NULL; - op->src_file = NULL; - op->src_descr = NULL; - op->src_tag = NULL; - op->dst_path = strdupW( part1 ); - op->dst_file = strdupW( part2 ); - queue_file_op( &queue->delete_queue, op ); - return TRUE; -} - - -/*********************************************************************** - * SetupQueueRenameA (SETUPAPI.@) - */ -BOOL WINAPI SetupQueueRenameA( HSPFILEQ handle, PCSTR SourcePath, PCSTR SourceFilename, - PCSTR TargetPath, PCSTR TargetFilename ) -{ - struct file_queue *queue = handle; - struct file_op *op; - - if (!(op = HeapAlloc( GetProcessHeap(), 0, sizeof(*op) ))) return FALSE; - op->style = 0; - op->src_root = NULL; - op->src_path = strdupAtoW( SourcePath ); - op->src_file = strdupAtoW( SourceFilename ); - op->src_descr = NULL; - op->src_tag = NULL; - op->dst_path = strdupAtoW( TargetPath ); - op->dst_file = strdupAtoW( TargetFilename ); - queue_file_op( &queue->rename_queue, op ); - return TRUE; -} - - -/*********************************************************************** - * SetupQueueRenameW (SETUPAPI.@) - */ -BOOL WINAPI SetupQueueRenameW( HSPFILEQ handle, PCWSTR SourcePath, PCWSTR SourceFilename, - PCWSTR TargetPath, PCWSTR TargetFilename ) -{ - struct file_queue *queue = handle; - struct file_op *op; - - if (!(op = HeapAlloc( GetProcessHeap(), 0, sizeof(*op) ))) return FALSE; - op->style = 0; - op->src_root = NULL; - op->src_path = strdupW( SourcePath ); - op->src_file = strdupW( SourceFilename ); - op->src_descr = NULL; - op->src_tag = NULL; - op->dst_path = strdupW( TargetPath ); - op->dst_file = strdupW( TargetFilename ); - queue_file_op( &queue->rename_queue, op ); - return TRUE; -} - - -/*********************************************************************** - * SetupQueueCopySectionA (SETUPAPI.@) - */ -BOOL WINAPI SetupQueueCopySectionA( HSPFILEQ queue, PCSTR src_root, HINF hinf, HINF hlist, - PCSTR section, DWORD style ) -{ - UNICODE_STRING sectionW; - BOOL ret = FALSE; - - if (!RtlCreateUnicodeStringFromAsciiz( §ionW, section )) - { - SetLastError( ERROR_NOT_ENOUGH_MEMORY ); - return FALSE; - } - if (!src_root) - ret = SetupQueueCopySectionW( queue, NULL, hinf, hlist, sectionW.Buffer, style ); - else - { - UNICODE_STRING srcW; - if (RtlCreateUnicodeStringFromAsciiz( &srcW, src_root )) - { - ret = SetupQueueCopySectionW( queue, srcW.Buffer, hinf, hlist, sectionW.Buffer, style ); - RtlFreeUnicodeString( &srcW ); - } - else SetLastError( ERROR_NOT_ENOUGH_MEMORY ); - } - RtlFreeUnicodeString( §ionW ); - return ret; -} - - -/*********************************************************************** - * SetupQueueCopySectionW (SETUPAPI.@) - */ -BOOL WINAPI SetupQueueCopySectionW( HSPFILEQ queue, PCWSTR src_root, HINF hinf, HINF hlist, - PCWSTR section, DWORD style ) -{ - SP_FILE_COPY_PARAMS_W params; - INFCONTEXT context; - WCHAR dest[MAX_PATH], src[MAX_PATH]; - INT flags; - - TRACE( "hinf=%p/%p section=%s root=%s\n", - hinf, hlist, debugstr_w(section), debugstr_w(src_root) ); - - params.cbSize = sizeof(params); - params.QueueHandle = queue; - params.SourceRootPath = src_root; - params.SourcePath = NULL; - params.SourceDescription = NULL; - params.SourceTagfile = NULL; - params.TargetFilename = dest; - params.CopyStyle = style; - params.LayoutInf = hinf; - params.SecurityDescriptor = NULL; - - if (!hlist) hlist = hinf; - if (!SetupFindFirstLineW( hlist, section, NULL, &context )) return FALSE; - if (!(params.TargetDirectory = get_destination_dir( hinf, section ))) return FALSE; - do - { - if (!SetupGetStringFieldW( &context, 1, dest, sizeof(dest)/sizeof(WCHAR), NULL )) - return FALSE; - if (!SetupGetStringFieldW( &context, 2, src, sizeof(src)/sizeof(WCHAR), NULL )) *src = 0; - if (!SetupGetIntField( &context, 4, &flags )) flags = 0; /* FIXME */ - - params.SourceFilename = *src ? src : NULL; - if (!SetupQueueCopyIndirectW( ¶ms )) return FALSE; - } while (SetupFindNextLine( &context, &context )); - return TRUE; -} - - -/*********************************************************************** - * SetupQueueDeleteSectionA (SETUPAPI.@) - */ -BOOL WINAPI SetupQueueDeleteSectionA( HSPFILEQ queue, HINF hinf, HINF hlist, PCSTR section ) -{ - UNICODE_STRING sectionW; - BOOL ret = FALSE; - - if (RtlCreateUnicodeStringFromAsciiz( §ionW, section )) - { - ret = SetupQueueDeleteSectionW( queue, hinf, hlist, sectionW.Buffer ); - RtlFreeUnicodeString( §ionW ); - } - else SetLastError( ERROR_NOT_ENOUGH_MEMORY ); - return ret; -} - - -/*********************************************************************** - * SetupQueueDeleteSectionW (SETUPAPI.@) - */ -BOOL WINAPI SetupQueueDeleteSectionW( HSPFILEQ queue, HINF hinf, HINF hlist, PCWSTR section ) -{ - INFCONTEXT context; - WCHAR *dest_dir; - WCHAR buffer[MAX_PATH]; - BOOL ret = FALSE; - INT flags; - - TRACE( "hinf=%p/%p section=%s\n", hinf, hlist, debugstr_w(section) ); - - if (!hlist) hlist = hinf; - if (!SetupFindFirstLineW( hlist, section, NULL, &context )) return FALSE; - if (!(dest_dir = get_destination_dir( hinf, section ))) return FALSE; - do - { - if (!SetupGetStringFieldW( &context, 1, buffer, sizeof(buffer)/sizeof(WCHAR), NULL )) - goto done; - if (!SetupGetIntField( &context, 4, &flags )) flags = 0; - if (!SetupQueueDeleteW( queue, dest_dir, buffer )) goto done; - } while (SetupFindNextLine( &context, &context )); - - ret = TRUE; - done: - HeapFree( GetProcessHeap(), 0, dest_dir ); - return ret; -} - - -/*********************************************************************** - * SetupQueueRenameSectionA (SETUPAPI.@) - */ -BOOL WINAPI SetupQueueRenameSectionA( HSPFILEQ queue, HINF hinf, HINF hlist, PCSTR section ) -{ - UNICODE_STRING sectionW; - BOOL ret = FALSE; - - if (RtlCreateUnicodeStringFromAsciiz( §ionW, section )) - { - ret = SetupQueueRenameSectionW( queue, hinf, hlist, sectionW.Buffer ); - RtlFreeUnicodeString( §ionW ); - } - else SetLastError( ERROR_NOT_ENOUGH_MEMORY ); - return ret; -} - - -/*********************************************************************** - * SetupQueueRenameSectionW (SETUPAPI.@) - */ -BOOL WINAPI SetupQueueRenameSectionW( HSPFILEQ queue, HINF hinf, HINF hlist, PCWSTR section ) -{ - INFCONTEXT context; - WCHAR *dest_dir; - WCHAR src[MAX_PATH], dst[MAX_PATH]; - BOOL ret = FALSE; - - TRACE( "hinf=%p/%p section=%s\n", hinf, hlist, debugstr_w(section) ); - - if (!hlist) hlist = hinf; - if (!SetupFindFirstLineW( hlist, section, NULL, &context )) return FALSE; - if (!(dest_dir = get_destination_dir( hinf, section ))) return FALSE; - do - { - if (!SetupGetStringFieldW( &context, 1, dst, sizeof(dst)/sizeof(WCHAR), NULL )) - goto done; - if (!SetupGetStringFieldW( &context, 2, src, sizeof(src)/sizeof(WCHAR), NULL )) - goto done; - if (!SetupQueueRenameW( queue, dest_dir, src, NULL, dst )) goto done; - } while (SetupFindNextLine( &context, &context )); - - ret = TRUE; - done: - HeapFree( GetProcessHeap(), 0, dest_dir ); - return ret; -} - - -/*********************************************************************** - * SetupCommitFileQueueA (SETUPAPI.@) - */ -BOOL WINAPI SetupCommitFileQueueA( HWND owner, HSPFILEQ queue, PSP_FILE_CALLBACK_A handler, - PVOID context ) -{ - struct callback_WtoA_context ctx; - - ctx.orig_context = context; - ctx.orig_handler = handler; - return SetupCommitFileQueueW( owner, queue, QUEUE_callback_WtoA, &ctx ); -} - - -/*********************************************************************** - * create_full_pathW - * - * Recursively create all directories in the path. - */ -static BOOL create_full_pathW(const WCHAR *path) -{ - BOOL ret = TRUE; - int len; - WCHAR *new_path; - - new_path = HeapAlloc(GetProcessHeap(), 0, (strlenW(path) + 1) * sizeof(WCHAR)); - strcpyW(new_path, path); - - while((len = strlenW(new_path)) && new_path[len - 1] == '\\') - new_path[len - 1] = 0; - - while(!CreateDirectoryW(new_path, NULL)) - { - WCHAR *slash; - DWORD last_error = GetLastError(); - - if(last_error == ERROR_ALREADY_EXISTS) - break; - - if(last_error != ERROR_PATH_NOT_FOUND) - { - ret = FALSE; - break; - } - - if(!(slash = strrchrW(new_path, '\\'))) - { - ret = FALSE; - break; - } - - len = slash - new_path; - new_path[len] = 0; - if(!create_full_pathW(new_path)) - { - ret = FALSE; - break; - } - new_path[len] = '\\'; - } - - HeapFree(GetProcessHeap(), 0, new_path); - return ret; -} - -BOOL static do_file_copyW( LPCWSTR source, LPCWSTR target, DWORD style) -{ - BOOL rc = FALSE; - BOOL docopy = TRUE; - - TRACE("copy %s to %s style 0x%lx\n",debugstr_w(source),debugstr_w(target),style); - - /* before copy processing */ - if (style & SP_COPY_REPLACEONLY) - { - if (GetFileAttributesW(target) == INVALID_FILE_ATTRIBUTES) - docopy = FALSE; - } - if (style & (SP_COPY_NEWER_OR_SAME | SP_COPY_NEWER_ONLY | SP_COPY_FORCE_NEWER)) - { - DWORD VersionSizeSource=0; - DWORD VersionSizeTarget=0; - DWORD zero=0; - - /* - * This is sort of an interesting workaround. You see, calling - * GetVersionInfoSize on a builtin dll loads that dll into memory - * and we do not properly unload builtin dlls.. so we effectively - * lock into memory all the targets we are replacing. This leads - * to problems when we try to register the replaced dlls. - * - * So I will test for the existence of the files first so that - * we just basically unconditionally replace the builtin versions. - */ - if ((GetFileAttributesW(target) != INVALID_FILE_ATTRIBUTES) && - (GetFileAttributesW(source) != INVALID_FILE_ATTRIBUTES)) - { - VersionSizeSource = GetFileVersionInfoSizeW((LPWSTR)source,&zero); - VersionSizeTarget = GetFileVersionInfoSizeW((LPWSTR)target,&zero); - } - - TRACE("SizeTarget %li ... SizeSource %li\n",VersionSizeTarget, - VersionSizeSource); - - if (VersionSizeSource && VersionSizeTarget) - { - LPVOID VersionSource; - LPVOID VersionTarget; - VS_FIXEDFILEINFO *TargetInfo; - VS_FIXEDFILEINFO *SourceInfo; - INT length; - WCHAR SubBlock[2]={'\\',0}; - DWORD ret; - - VersionSource = HeapAlloc(GetProcessHeap(),0,VersionSizeSource); - VersionTarget = HeapAlloc(GetProcessHeap(),0,VersionSizeTarget); - - ret = GetFileVersionInfoW((LPWSTR)source,0,VersionSizeSource,VersionSource); - if (ret) - ret = GetFileVersionInfoW((LPWSTR)target, 0, VersionSizeTarget, - VersionTarget); - - if (ret) - { - ret = VerQueryValueW(VersionSource, SubBlock, - (LPVOID*)&SourceInfo, &length); - if (ret) - ret = VerQueryValueW(VersionTarget, SubBlock, - (LPVOID*)&TargetInfo, &length); - - if (ret) - { - TRACE("Versions: Source %li.%li target %li.%li\n", - SourceInfo->dwFileVersionMS, SourceInfo->dwFileVersionLS, - TargetInfo->dwFileVersionMS, TargetInfo->dwFileVersionLS); - - if (TargetInfo->dwFileVersionMS > SourceInfo->dwFileVersionMS) - { - FIXME("Notify that target version is greater..\n"); - docopy = FALSE; - } - else if ((TargetInfo->dwFileVersionMS == SourceInfo->dwFileVersionMS) - && (TargetInfo->dwFileVersionLS > SourceInfo->dwFileVersionLS)) - { - FIXME("Notify that target version is greater..\n"); - docopy = FALSE; - } - else if ((style & SP_COPY_NEWER_ONLY) && - (TargetInfo->dwFileVersionMS == - SourceInfo->dwFileVersionMS) - &&(TargetInfo->dwFileVersionLS == - SourceInfo->dwFileVersionLS)) - { - FIXME("Notify that target version is greater..\n"); - docopy = FALSE; - } - } - } - HeapFree(GetProcessHeap(),0,VersionSource); - HeapFree(GetProcessHeap(),0,VersionTarget); - } - } - if (style & (SP_COPY_NOOVERWRITE | SP_COPY_FORCE_NOOVERWRITE)) - { - if (GetFileAttributesW(target) != INVALID_FILE_ATTRIBUTES) - { - FIXME("Notify user target file exists\n"); - docopy = FALSE; - } - } - if (style & (SP_COPY_NODECOMP | SP_COPY_LANGUAGEAWARE | SP_COPY_FORCE_IN_USE | - SP_COPY_IN_USE_NEEDS_REBOOT | SP_COPY_NOSKIP | SP_COPY_WARNIFSKIP)) - { - ERR("Unsupported style(s) 0x%lx\n",style); - } - - if (docopy) - { - rc = CopyFileW(source,target,FALSE); - TRACE("Did copy... rc was %i\n",rc); - } - - /* after copy processing */ - if (style & SP_COPY_DELETESOURCE) - { - if (rc) - DeleteFileW(source); - } - - return rc; -} - -/*********************************************************************** - * SetupCommitFileQueueW (SETUPAPI.@) - */ -BOOL WINAPI SetupCommitFileQueueW( HWND owner, HSPFILEQ handle, PSP_FILE_CALLBACK_W handler, - PVOID context ) -{ - struct file_queue *queue = handle; - struct file_op *op; - BOOL result = FALSE; - FILEPATHS_W paths; - UINT op_result; - - paths.Source = paths.Target = NULL; - - if (!queue->copy_queue.count && !queue->delete_queue.count && !queue->rename_queue.count) - return TRUE; /* nothing to do */ - - if (!handler( context, SPFILENOTIFY_STARTQUEUE, (UINT)owner, 0 )) return FALSE; - - /* perform deletes */ - - if (queue->delete_queue.count) - { - if (!(handler( context, SPFILENOTIFY_STARTSUBQUEUE, FILEOP_DELETE, - queue->delete_queue.count ))) goto done; - for (op = queue->delete_queue.head; op; op = op->next) - { - build_filepathsW( op, &paths ); - op_result = handler( context, SPFILENOTIFY_STARTDELETE, (UINT_PTR)&paths, FILEOP_DELETE); - if (op_result == FILEOP_ABORT) goto done; - while (op_result == FILEOP_DOIT) - { - TRACE( "deleting file %s\n", debugstr_w(paths.Target) ); - if (DeleteFileW( paths.Target )) break; /* success */ - paths.Win32Error = GetLastError(); - op_result = handler( context, SPFILENOTIFY_DELETEERROR, (UINT_PTR)&paths, 0 ); - if (op_result == FILEOP_ABORT) goto done; - } - handler( context, SPFILENOTIFY_ENDDELETE, (UINT_PTR)&paths, 0 ); - } - handler( context, SPFILENOTIFY_ENDSUBQUEUE, FILEOP_DELETE, 0 ); - } - - /* perform renames */ - - if (queue->rename_queue.count) - { - if (!(handler( context, SPFILENOTIFY_STARTSUBQUEUE, FILEOP_RENAME, - queue->rename_queue.count ))) goto done; - for (op = queue->rename_queue.head; op; op = op->next) - { - build_filepathsW( op, &paths ); - op_result = handler( context, SPFILENOTIFY_STARTRENAME, (UINT_PTR)&paths, FILEOP_RENAME); - if (op_result == FILEOP_ABORT) goto done; - while (op_result == FILEOP_DOIT) - { - TRACE( "renaming file %s -> %s\n", - debugstr_w(paths.Source), debugstr_w(paths.Target) ); - if (MoveFileW( paths.Source, paths.Target )) break; /* success */ - paths.Win32Error = GetLastError(); - op_result = handler( context, SPFILENOTIFY_RENAMEERROR, (UINT_PTR)&paths, 0 ); - if (op_result == FILEOP_ABORT) goto done; - } - handler( context, SPFILENOTIFY_ENDRENAME, (UINT_PTR)&paths, 0 ); - } - handler( context, SPFILENOTIFY_ENDSUBQUEUE, FILEOP_RENAME, 0 ); - } - - /* perform copies */ - - if (queue->copy_queue.count) - { - if (!(handler( context, SPFILENOTIFY_STARTSUBQUEUE, FILEOP_COPY, - queue->copy_queue.count ))) goto done; - for (op = queue->copy_queue.head; op; op = op->next) - { - WCHAR newpath[MAX_PATH]; - - build_filepathsW( op, &paths ); - op_result = handler( context, SPFILENOTIFY_STARTCOPY, (UINT_PTR)&paths, FILEOP_COPY ); - if (op_result == FILEOP_ABORT) goto done; - if (op_result == FILEOP_NEWPATH) op_result = FILEOP_DOIT; - while (op_result == FILEOP_DOIT || op_result == FILEOP_NEWPATH) - { - TRACE( "copying file %s -> %s\n", - debugstr_w( op_result == FILEOP_NEWPATH ? newpath : paths.Source ), - debugstr_w(paths.Target) ); - if (op->dst_path) - { - if (!create_full_pathW( op->dst_path )) - { - paths.Win32Error = GetLastError(); - op_result = handler( context, SPFILENOTIFY_COPYERROR, - (UINT_PTR)&paths, (UINT_PTR)newpath ); - if (op_result == FILEOP_ABORT) goto done; - } - } - if (do_file_copyW( op_result == FILEOP_NEWPATH ? newpath : paths.Source, - paths.Target, op->style )) break; /* success */ - /* try to extract it from the cabinet file */ - if (op->src_tag) - { - if (extract_cabinet_file( op->src_tag, op->src_root, - paths.Source, paths.Target )) break; - } - paths.Win32Error = GetLastError(); - op_result = handler( context, SPFILENOTIFY_COPYERROR, - (UINT_PTR)&paths, (UINT_PTR)newpath ); - if (op_result == FILEOP_ABORT) goto done; - } - handler( context, SPFILENOTIFY_ENDCOPY, (UINT_PTR)&paths, 0 ); - } - handler( context, SPFILENOTIFY_ENDSUBQUEUE, FILEOP_COPY, 0 ); - } - - - result = TRUE; - - done: - handler( context, SPFILENOTIFY_ENDQUEUE, result, 0 ); - HeapFree( GetProcessHeap(), 0, (void *)paths.Source ); - HeapFree( GetProcessHeap(), 0, (void *)paths.Target ); - return result; -} - - -/*********************************************************************** - * SetupScanFileQueueA (SETUPAPI.@) - */ -BOOL WINAPI SetupScanFileQueueA( HSPFILEQ queue, DWORD flags, HWND window, - PSP_FILE_CALLBACK_A callback, PVOID context, PDWORD result ) -{ - FIXME("stub\n"); - return FALSE; -} - - -/*********************************************************************** - * SetupScanFileQueueW (SETUPAPI.@) - */ -BOOL WINAPI SetupScanFileQueueW( HSPFILEQ queue, DWORD flags, HWND window, - PSP_FILE_CALLBACK_W callback, PVOID context, PDWORD result ) -{ - FIXME("stub\n"); - return FALSE; -} - - -/*********************************************************************** - * SetupGetFileQueueCount (SETUPAPI.@) - */ -BOOL WINAPI SetupGetFileQueueCount( HSPFILEQ handle, UINT op, PUINT result ) -{ - struct file_queue *queue = handle; - - switch(op) - { - case FILEOP_COPY: - *result = queue->copy_queue.count; - return TRUE; - case FILEOP_RENAME: - *result = queue->rename_queue.count; - return TRUE; - case FILEOP_DELETE: - *result = queue->delete_queue.count; - return TRUE; - } - return FALSE; -} - - -/*********************************************************************** - * SetupGetFileQueueFlags (SETUPAPI.@) - */ -BOOL WINAPI SetupGetFileQueueFlags( HSPFILEQ handle, PDWORD flags ) -{ - struct file_queue *queue = handle; - *flags = queue->flags; - return TRUE; -} - - -/*********************************************************************** - * SetupSetFileQueueFlags (SETUPAPI.@) - */ -BOOL WINAPI SetupSetFileQueueFlags( HSPFILEQ handle, DWORD mask, DWORD flags ) -{ - struct file_queue *queue = handle; - queue->flags = (queue->flags & ~mask) | flags; - return TRUE; -} - - -/*********************************************************************** - * SetupInitDefaultQueueCallback (SETUPAPI.@) - */ -PVOID WINAPI SetupInitDefaultQueueCallback( HWND owner ) -{ - return SetupInitDefaultQueueCallbackEx( owner, 0, 0, 0, NULL ); -} - - -/*********************************************************************** - * SetupInitDefaultQueueCallbackEx (SETUPAPI.@) - */ -PVOID WINAPI SetupInitDefaultQueueCallbackEx( HWND owner, HWND progress, UINT msg, - DWORD reserved1, PVOID reserved2 ) -{ - struct default_callback_context *context; - - if ((context = HeapAlloc( GetProcessHeap(), 0, sizeof(*context) ))) - { - context->owner = owner; - context->progress = progress; - context->message = msg; - } - return context; -} - - -/*********************************************************************** - * SetupTermDefaultQueueCallback (SETUPAPI.@) - */ -void WINAPI SetupTermDefaultQueueCallback( PVOID context ) -{ - HeapFree( GetProcessHeap(), 0, context ); -} - - -/*********************************************************************** - * SetupDefaultQueueCallbackA (SETUPAPI.@) - */ -UINT WINAPI SetupDefaultQueueCallbackA( PVOID context, UINT notification, - UINT_PTR param1, UINT_PTR param2 ) -{ - FILEPATHS_A *paths = (FILEPATHS_A *)param1; - - switch(notification) - { - case SPFILENOTIFY_STARTQUEUE: - TRACE( "start queue\n" ); - return TRUE; - case SPFILENOTIFY_ENDQUEUE: - TRACE( "end queue\n" ); - return 0; - case SPFILENOTIFY_STARTSUBQUEUE: - TRACE( "start subqueue %d count %d\n", param1, param2 ); - return TRUE; - case SPFILENOTIFY_ENDSUBQUEUE: - TRACE( "end subqueue %d\n", param1 ); - return 0; - case SPFILENOTIFY_STARTDELETE: - TRACE( "start delete %s\n", debugstr_a(paths->Target) ); - return FILEOP_DOIT; - case SPFILENOTIFY_ENDDELETE: - TRACE( "end delete %s\n", debugstr_a(paths->Target) ); - return 0; - case SPFILENOTIFY_DELETEERROR: - ERR( "delete error %d %s\n", paths->Win32Error, debugstr_a(paths->Target) ); - return FILEOP_SKIP; - case SPFILENOTIFY_STARTRENAME: - TRACE( "start rename %s -> %s\n", debugstr_a(paths->Source), debugstr_a(paths->Target) ); - return FILEOP_DOIT; - case SPFILENOTIFY_ENDRENAME: - TRACE( "end rename %s -> %s\n", debugstr_a(paths->Source), debugstr_a(paths->Target) ); - return 0; - case SPFILENOTIFY_RENAMEERROR: - ERR( "rename error %d %s -> %s\n", paths->Win32Error, - debugstr_a(paths->Source), debugstr_a(paths->Target) ); - return FILEOP_SKIP; - case SPFILENOTIFY_STARTCOPY: - TRACE( "start copy %s -> %s\n", debugstr_a(paths->Source), debugstr_a(paths->Target) ); - return FILEOP_DOIT; - case SPFILENOTIFY_ENDCOPY: - TRACE( "end copy %s -> %s\n", debugstr_a(paths->Source), debugstr_a(paths->Target) ); - return 0; - case SPFILENOTIFY_COPYERROR: - ERR( "copy error %d %s -> %s\n", paths->Win32Error, - debugstr_a(paths->Source), debugstr_a(paths->Target) ); - return FILEOP_SKIP; - case SPFILENOTIFY_NEEDMEDIA: - TRACE( "need media\n" ); - return FILEOP_SKIP; - default: - FIXME( "notification %d params %x,%x\n", notification, param1, param2 ); - break; - } - return 0; -} - - -/*********************************************************************** - * SetupDefaultQueueCallbackW (SETUPAPI.@) - */ -UINT WINAPI SetupDefaultQueueCallbackW( PVOID context, UINT notification, - UINT_PTR param1, UINT_PTR param2 ) -{ - FIXME( "notification %d params %x,%x\n", notification, param1, param2 ); - return FILEOP_SKIP; -} diff --git a/reactos/lib/setupapi/setupapi.rc b/reactos/lib/setupapi/setupapi.rc deleted file mode 100644 index c9da163f63c..00000000000 --- a/reactos/lib/setupapi/setupapi.rc +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Top level resource file for SETUPX - * - * Copyright 2001 Andreas Mohr - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include "windef.h" -#include "winbase.h" -#include "winuser.h" -#include "winnls.h" -#include "setupapi_private.h" - -#include "En.rc" -#include "De.rc" -#include "Es.rc" -#include "Fr.rc" -#include "It.rc" -#include "Nl.rc" -#include "Pt.rc" -#include "Ru.rc" diff --git a/reactos/lib/setupapi/setupapi.spec b/reactos/lib/setupapi/setupapi.spec deleted file mode 100644 index 88e8ca4cd12..00000000000 --- a/reactos/lib/setupapi/setupapi.spec +++ /dev/null @@ -1,335 +0,0 @@ -@ stdcall CM_Connect_MachineW(wstr ptr) -@ stdcall CM_Disconnect_Machine(long) -@ stub CM_Free_Log_Conf_Handle -@ stub CM_Free_Res_Des_Handle -@ stub CM_Get_DevNode_Status_Ex -@ stub CM_Get_Device_ID_ExW -@ stub CM_Get_First_Log_Conf_Ex -@ stub CM_Get_Next_Res_Des_Ex -@ stub CM_Get_Res_Des_Data_Ex -@ stub CM_Get_Res_Des_Data_Size_Ex -@ stub CM_Locate_DevNode_ExW -@ stub CM_Reenumerate_DevNode_Ex -@ stub CaptureAndConvertAnsiArg -@ stub CaptureStringArg -@ stub CenterWindowRelativeToParent -@ stub ConcatenatePaths -@ stub DelayedMove -@ stub DelimStringToMultiSz -@ stub DestroyTextFileReadBuffer -@ stub DoesUserHavePrivilege -@ stub DuplicateString -@ stub EnablePrivilege -@ stub ExtensionPropSheetPageProc -@ stub FileExists -@ stub FreeStringArray -@ stub GetNewInfName -@ stub GetSetFileTimestamp -@ stub GetVersionInfoFromImage -@ stub InfIsFromOemLocation -@ stdcall InstallHinfSection(long long str long) InstallHinfSectionA -@ stdcall InstallHinfSectionA(long long str long) -@ stdcall InstallHinfSectionW(long long wstr long) -@ stub InstallStop -@ stub IsUserAdmin -@ stub LookUpStringInTable -@ stub MemoryInitialize -@ stub MultiByteToUnicode -@ stub MultiSzFromSearchControl -@ stub MyFree -@ stub MyGetFileTitle -@ stub MyMalloc -@ stub MyRealloc -@ stub OpenAndMapFileForRead -@ stub OutOfMemory -@ stub QueryMultiSzValueToArray -@ stub QueryRegistryValue -@ stub ReadAsciiOrUnicodeTextFile -@ stub RegistryDelnode -@ stub RetreiveFileSecurity -@ stub RetrieveServiceConfig -@ stub SearchForInfFile -@ stub SetArrayToMultiSzValue -@ stdcall SetupAddInstallSectionToDiskSpaceListA(long long long str ptr long) -@ stub SetupAddInstallSectionToDiskSpaceListW -@ stub SetupAddSectionToDiskSpaceListA -@ stub SetupAddSectionToDiskSpaceListW -@ stub SetupAddToDiskSpaceListA -@ stub SetupAddToDiskSpaceListW -@ stub SetupAddToSourceListA -@ stub SetupAddToSourceListW -@ stub SetupAdjustDiskSpaceListA -@ stub SetupAdjustDiskSpaceListW -@ stub SetupCancelTemporarySourceList -@ stdcall SetupCloseFileQueue(ptr) -@ stdcall SetupCloseInfFile(long) -@ stdcall SetupCommitFileQueue(long long ptr ptr) SetupCommitFileQueueW -@ stdcall SetupCommitFileQueueA(long long ptr ptr) -@ stdcall SetupCommitFileQueueW(long long ptr ptr) -@ stub SetupCopyErrorA -@ stub SetupCopyErrorW -@ stdcall SetupCopyOEMInfA(str str long long ptr long ptr ptr) -@ stub SetupCopyOEMInfW -@ stdcall SetupCreateDiskSpaceListA(ptr long long) -@ stdcall SetupCreateDiskSpaceListW(ptr long long) -@ stub SetupDecompressOrCopyFileA -@ stub SetupDecompressOrCopyFileW -@ stub SetupDefaultQueueCallback -@ stdcall SetupDefaultQueueCallbackA(ptr long long long) -@ stdcall SetupDefaultQueueCallbackW(ptr long long long) -@ stub SetupDeleteErrorA -@ stub SetupDeleteErrorW -@ stdcall SetupDestroyDiskSpaceList(long) -@ stub SetupDiAskForOEMDisk -@ stdcall SetupDiBuildClassInfoList(long ptr long ptr) -@ stdcall SetupDiBuildClassInfoListExA(long ptr long ptr str ptr) -@ stdcall SetupDiBuildClassInfoListExW(long ptr long ptr wstr ptr) -@ stub SetupDiBuildDriverInfoList -@ stub SetupDiCallClassInstaller -@ stub SetupDiCancelDriverInfoSearch -@ stub SetupDiChangeState -@ stdcall SetupDiClassGuidsFromNameA(str ptr long ptr) -@ stdcall SetupDiClassGuidsFromNameExA(str ptr long ptr str ptr) -@ stdcall SetupDiClassGuidsFromNameExW(wstr ptr long ptr wstr ptr) -@ stdcall SetupDiClassGuidsFromNameW(wstr ptr long ptr) -@ stdcall SetupDiClassNameFromGuidA(ptr str long ptr) -@ stdcall SetupDiClassNameFromGuidExA(ptr str long ptr wstr ptr) -@ stdcall SetupDiClassNameFromGuidExW(ptr wstr long ptr wstr ptr) -@ stdcall SetupDiClassNameFromGuidW(ptr wstr long ptr) -@ stub SetupDiCreateDevRegKeyA -@ stub SetupDiCreateDevRegKeyW -@ stub SetupDiCreateDeviceInfoA -@ stdcall SetupDiCreateDeviceInfoList(ptr ptr) -@ stdcall SetupDiCreateDeviceInfoListExA(ptr long str ptr) -@ stdcall SetupDiCreateDeviceInfoListExW(ptr long wstr ptr) -@ stub SetupDiCreateDeviceInfoW -@ stub SetupDiDeleteDevRegKey -@ stub SetupDiDeleteDeviceInfo -@ stub SetupDiDestroyClassImageList -@ stdcall SetupDiDestroyDeviceInfoList(long) -@ stub SetupDiDestroyDriverInfoList -@ stub SetupDiDrawMiniIcon -@ stdcall SetupDiEnumDeviceInfo(long long ptr) -@ stdcall SetupDiEnumDeviceInterfaces(long ptr ptr long ptr) -@ stub SetupDiEnumDriverInfoA -@ stub SetupDiEnumDriverInfoW -@ stdcall SetupDiGetActualSectionToInstallA(long str str long ptr ptr) -@ stdcall SetupDiGetActualSectionToInstallW(long wstr wstr long ptr ptr) -@ stub SetupDiGetClassBitmapIndex -@ stdcall SetupDiGetClassDescriptionA(ptr str long ptr) -@ stdcall SetupDiGetClassDescriptionExA(ptr str long ptr str ptr) -@ stdcall SetupDiGetClassDescriptionExW(ptr wstr long ptr wstr ptr) -@ stdcall SetupDiGetClassDescriptionW(ptr wstr long ptr) -@ stub SetupDiGetClassDevPropertySheetsA -@ stub SetupDiGetClassDevPropertySheetsW -@ stdcall SetupDiGetClassDevsA(ptr ptr long long) -@ stdcall SetupDiGetClassDevsExA(ptr str ptr long ptr str ptr) -@ stdcall SetupDiGetClassDevsExW(ptr wstr ptr long ptr wstr ptr) -@ stdcall SetupDiGetClassDevsW(ptr ptr long long) -@ stub SetupDiGetClassImageIndex -@ stub SetupDiGetClassImageList -@ stub SetupDiGetClassImageListExW -@ stub SetupDiGetClassInstallParamsA -@ stub SetupDiGetClassInstallParamsW -@ stub SetupDiGetDeviceInfoListClass -@ stdcall SetupDiGetDeviceInfoListDetailA(ptr ptr) -@ stdcall SetupDiGetDeviceInfoListDetailW(ptr ptr) -@ stub SetupDiGetDeviceInstallParamsA -@ stub SetupDiGetDeviceInstallParamsW -@ stub SetupDiGetDeviceInstanceIdA -@ stub SetupDiGetDeviceInstanceIdW -@ stdcall SetupDiGetDeviceRegistryPropertyA(long ptr long ptr ptr long ptr) -@ stub SetupDiGetDeviceRegistryPropertyW -@ stub SetupDiGetDriverInfoDetailA -@ stub SetupDiGetDriverInfoDetailW -@ stub SetupDiGetDriverInstallParamsA -@ stub SetupDiGetDriverInstallParamsW -@ stub SetupDiGetDeviceInterfaceAlias -@ stdcall SetupDiGetDeviceInterfaceDetailA(long ptr ptr long ptr ptr) -@ stdcall SetupDiGetDeviceInterfaceDetailW(long ptr ptr long ptr ptr) -@ stub SetupDiGetHwProfileFriendlyNameA -@ stub SetupDiGetHwProfileFriendlyNameW -@ stub SetupDiGetHwProfileList -@ stub SetupDiGetINFClassA -@ stub SetupDiGetINFClassW -@ stub SetupDiGetSelectedDevice -@ stub SetupDiGetSelectedDriverA -@ stub SetupDiGetSelectedDriverW -@ stub SetupDiGetWizardPage -@ stdcall SetupDiInstallClassA(long str long ptr) -@ stdcall SetupDiInstallClassW(long wstr long ptr) -@ stub SetupDiInstallDevice -@ stub SetupDiInstallDriverFiles -@ stub SetupDiLoadClassIcon -@ stub SetupDiMoveDuplicateDevice -@ stdcall SetupDiOpenClassRegKey(ptr long) -@ stdcall SetupDiOpenClassRegKeyExA(ptr long long str ptr) -@ stdcall SetupDiOpenClassRegKeyExW(ptr long long wstr ptr) -@ stub SetupDiOpenDevRegKey -@ stub SetupDiOpenDeviceInfoA -@ stub SetupDiOpenDeviceInfoW -@ stub SetupDiOpenDeviceInterfaceRegKey -@ stub SetupDiRegisterDeviceInfo -@ stub SetupDiRemoveDevice -@ stub SetupDiSelectDevice -@ stub SetupDiSelectOEMDrv -@ stub SetupDiSetClassInstallParamsA -@ stub SetupDiSetClassInstallParamsW -@ stub SetupDiSetDeviceInstallParamsA -@ stub SetupDiSetDeviceInstallParamsW -@ stub SetupDiSetDeviceRegistryPropertyA -@ stub SetupDiSetDeviceRegistryPropertyW -@ stub SetupDiSetDriverInstallParamsA -@ stub SetupDiSetDriverInstallParamsW -@ stub SetupDiSetSelectedDevice -@ stub SetupDiSetSelectedDriverA -@ stub SetupDiSetSelectedDriverW -@ stub SetupDuplicateDiskSpaceListA -@ stub SetupDuplicateDiskSpaceListW -@ stdcall SetupFindFirstLineA(long str str ptr) -@ stdcall SetupFindFirstLineW(long wstr wstr ptr) -@ stdcall SetupFindNextLine(ptr ptr) -@ stdcall SetupFindNextMatchLineA(ptr str ptr) -@ stdcall SetupFindNextMatchLineW(ptr wstr ptr) -@ stub SetupFreeSourceListA -@ stub SetupFreeSourceListW -@ stdcall SetupGetBinaryField(ptr long ptr long ptr) -@ stdcall SetupGetFieldCount(ptr) -@ stub SetupGetFileCompressionInfoA -@ stub SetupGetFileCompressionInfoW -@ stdcall SetupGetFileQueueCount(long long ptr) -@ stdcall SetupGetFileQueueFlags(long ptr) -@ stub SetupGetInfFileListA -@ stub SetupGetInfFileListW -@ stdcall SetupGetInfInformationA(ptr long ptr long ptr) -@ stub SetupGetInfInformationW -@ stdcall SetupGetIntField(ptr long ptr) -@ stdcall SetupGetLineByIndexA(long str long ptr) -@ stdcall SetupGetLineByIndexW(long wstr long ptr) -@ stdcall SetupGetLineCountA(long str) -@ stdcall SetupGetLineCountW(long wstr) -@ stdcall SetupGetLineTextA(ptr long str str ptr long ptr) -@ stdcall SetupGetLineTextW(ptr long wstr wstr ptr long ptr) -@ stdcall SetupGetMultiSzFieldA(ptr long ptr long ptr) -@ stdcall SetupGetMultiSzFieldW(ptr long ptr long ptr) -@ stub SetupGetSourceFileLocationA -@ stub SetupGetSourceFileLocationW -@ stub SetupGetSourceFileSizeA -@ stub SetupGetSourceFileSizeW -@ stub SetupGetSourceInfoA -@ stub SetupGetSourceInfoW -@ stdcall SetupGetStringFieldA(ptr long ptr long ptr) -@ stdcall SetupGetStringFieldW(ptr long ptr long ptr) -@ stub SetupGetTargetPathA -@ stub SetupGetTargetPathW -@ stdcall SetupInitDefaultQueueCallback(long) -@ stdcall SetupInitDefaultQueueCallbackEx(long long long long ptr) -@ stdcall SetupInitializeFileLogA (str long) -@ stdcall SetupInitializeFileLogW (wstr long) -@ stub SetupInstallFileA -@ stub SetupInstallFileExA -@ stub SetupInstallFileExW -@ stub SetupInstallFileW -@ stdcall SetupInstallFilesFromInfSectionA(long long long str str long) -@ stdcall SetupInstallFilesFromInfSectionW(long long long wstr wstr long) -@ stdcall SetupInstallFromInfSectionA(long long str long long str long ptr ptr long ptr) -@ stdcall SetupInstallFromInfSectionW(long long wstr long long wstr long ptr ptr long ptr) -@ stub SetupInstallServicesFromInfSectionA -@ stub SetupInstallServicesFromInfSectionW -@ stdcall SetupIterateCabinetA(str long ptr ptr) -@ stdcall SetupIterateCabinetW(wstr long ptr ptr) -@ stub SetupLogFileA -@ stub SetupLogFileW -@ stdcall SetupOpenAppendInfFileA(str long ptr) -@ stdcall SetupOpenAppendInfFileW(wstr long ptr) -@ stdcall SetupOpenFileQueue() -@ stdcall SetupOpenInfFileA(str str long ptr) -@ stdcall SetupOpenInfFileW(wstr wstr long ptr) -@ stdcall SetupOpenMasterInf() -@ stub SetupPromptForDiskA -@ stub SetupPromptForDiskW -@ stub SetupPromptReboot -@ stub SetupQueryDrivesInDiskSpaceListA -@ stub SetupQueryDrivesInDiskSpaceListW -@ stub SetupQueryFileLogA -@ stub SetupQueryFileLogW -@ stub SetupQueryInfFileInformationA -@ stub SetupQueryInfFileInformationW -@ stub SetupQueryInfVersionInformationA -@ stub SetupQueryInfVersionInformationW -@ stub SetupQueryInfOriginalFileInformationW -@ stub SetupQuerySourceListA -@ stub SetupQuerySourceListW -@ stdcall SetupQuerySpaceRequiredOnDriveA(long str ptr ptr long) -@ stub SetupQuerySpaceRequiredOnDriveW -@ stdcall SetupQueueCopyA(long str str str str str str str long) -@ stdcall SetupQueueCopyIndirectA(ptr) -@ stdcall SetupQueueCopyIndirectW(ptr) -@ stdcall SetupQueueCopySectionA(long str long long str long) -@ stdcall SetupQueueCopySectionW(long wstr long long wstr long) -@ stdcall SetupQueueCopyW(long wstr wstr wstr wstr wstr wstr wstr long) -@ stdcall SetupQueueDefaultCopyA(long long str str str long) -@ stdcall SetupQueueDefaultCopyW(long long wstr wstr wstr long) -@ stdcall SetupQueueDeleteA(long str str) -@ stdcall SetupQueueDeleteSectionA(long long long str) -@ stdcall SetupQueueDeleteSectionW(long long long wstr) -@ stdcall SetupQueueDeleteW(long wstr wstr) -@ stdcall SetupQueueRenameA(long str str str str) -@ stdcall SetupQueueRenameSectionA(long long long str) -@ stdcall SetupQueueRenameSectionW(long long long wstr) -@ stdcall SetupQueueRenameW(long wstr wstr wstr wstr) -@ stub SetupRemoveFileLogEntryA -@ stub SetupRemoveFileLogEntryW -@ stub SetupRemoveFromDiskSpaceListA -@ stub SetupRemoveFromDiskSpaceListW -@ stub SetupRemoveFromSourceListA -@ stub SetupRemoveFromSourceListW -@ stub SetupRemoveInstallSectionFromDiskSpaceListA -@ stub SetupRemoveInstallSectionFromDiskSpaceListW -@ stub SetupRemoveSectionFromDiskSpaceListA -@ stub SetupRemoveSectionFromDiskSpaceListW -@ stub SetupRenameErrorA -@ stub SetupRenameErrorW -@ stub SetupScanFileQueue -@ stdcall SetupScanFileQueueA(long long long ptr ptr ptr) -@ stdcall SetupScanFileQueueW(long long long ptr ptr ptr) -@ stdcall SetupSetDirectoryIdA(long long str) -@ stub SetupSetDirectoryIdExA -@ stub SetupSetDirectoryIdExW -@ stdcall SetupSetDirectoryIdW(long long wstr) -@ stdcall SetupSetFileQueueFlags(long long long) -@ stub SetupSetPlatformPathOverrideA -@ stub SetupSetPlatformPathOverrideW -@ stub SetupSetSourceListA -@ stub SetupSetSourceListW -@ stdcall SetupTermDefaultQueueCallback(ptr) -@ stdcall SetupTerminateFileLog(long) -@ stub ShouldDeviceBeExcluded -@ stub StampFileSecurity -@ stub StringTableAddString -@ stub StringTableAddStringEx -@ stub StringTableDestroy -@ stub StringTableDuplicate -@ stub StringTableEnum -@ stub StringTableGetExtraData -@ stub StringTableInitialize -@ stub StringTableInitializeEx -@ stub StringTableLookUpString -@ stub StringTableLookUpStringEx -@ stub StringTableSetExtraData -@ stub StringTableStringFromId -@ stub StringTableTrim -@ stub TakeOwnershipOfFile -@ stub UnicodeToMultiByte -@ stub UnmapAndCloseFile -@ stub pSetupAddMiniIconToList -@ stub pSetupAddTagToGroupOrderListEntry -@ stub pSetupAppendStringToMultiSz -@ stub pSetupDirectoryIdToPath -@ stub pSetupGetField -@ stub pSetupGetOsLoaderDriveAndPath -@ stub pSetupGetVersionDatum -@ stub pSetupGuidFromString -@ stub pSetupIsGuidNull -@ stub pSetupMakeSurePathExists -@ stub pSetupStringFromGuid diff --git a/reactos/lib/setupapi/setupapi.xml b/reactos/lib/setupapi/setupapi.xml deleted file mode 100644 index bab6a004fd3..00000000000 --- a/reactos/lib/setupapi/setupapi.xml +++ /dev/null @@ -1,33 +0,0 @@ - - winebuild - - . - include/wine - - - - - 0x600 - 0x501 - 0x501 - - - wine - wine_unicode - ntdll - kernel32 - advapi32 - user32 - rpcrt4 - version - devinst.c - dirid.c - diskspace.c - install.c - parser.c - queue.c - setupcab.c - stubs.c - setupapi.rc - setupapi.spec - diff --git a/reactos/lib/setupapi/setupapi_private.h b/reactos/lib/setupapi/setupapi_private.h deleted file mode 100644 index 7cd40e4f146..00000000000 --- a/reactos/lib/setupapi/setupapi_private.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright 2001 Andreas Mohr - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef __SETUPAPI_PRIVATE_H -#define __SETUPAPI_PRIVATE_H - -#define COPYFILEDLGORD 1000 -#define SOURCESTRORD 500 -#define DESTSTRORD 501 -#define PROGRESSORD 502 - - -#define REG_INSTALLEDFILES "System\\CurrentControlSet\\Control\\InstalledFiles" -#define REGPART_RENAME "\\Rename" -#define REG_VERSIONCONFLICT "Software\\Microsoft\\VersionConflictManager" - -/* string substitutions */ - -struct inf_file; -extern const WCHAR *DIRID_get_string( HINF hinf, int dirid ); -extern unsigned int PARSER_string_substA( struct inf_file *file, const WCHAR *text, - char *buffer, unsigned int size ); -extern unsigned int PARSER_string_substW( struct inf_file *file, const WCHAR *text, - WCHAR *buffer, unsigned int size ); -extern const WCHAR *PARSER_get_src_root( HINF hinf ); -extern WCHAR *PARSER_get_dest_dir( INFCONTEXT *context ); - -/* support for Ascii queue callback functions */ - -struct callback_WtoA_context -{ - void *orig_context; - PSP_FILE_CALLBACK_A orig_handler; -}; - -UINT CALLBACK QUEUE_callback_WtoA( void *context, UINT notification, UINT_PTR, UINT_PTR ); - -/* from msvcrt/sys/stat.h */ -#define _S_IWRITE 0x0080 -#define _S_IREAD 0x0100 - -#endif /* __SETUPAPI_PRIVATE_H */ diff --git a/reactos/lib/setupapi/setupcab.c b/reactos/lib/setupapi/setupcab.c deleted file mode 100644 index ba27fd80b22..00000000000 --- a/reactos/lib/setupapi/setupcab.c +++ /dev/null @@ -1,686 +0,0 @@ -/* - * Setupapi cabinet routines - * - * Copyright 2003 Gregory M. Turner - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * - * Many useful traces are commented in code, uncomment them if you have - * trouble and run with --debugmsg +setupapi - * - */ - -#include -#include -#include - -#include "wine/debug.h" -#include "windef.h" -#include "winbase.h" -#include "wingdi.h" -#include "winuser.h" -#include "winnls.h" -#include "winreg.h" -#include "setupapi.h" -#include "setupapi_private.h" -#include "fdi.h" -#include "wine/unicode.h" - -#include -#include - -#include "wine/debug.h" - -static HINSTANCE CABINET_hInstance = 0; - -static HFDI (__cdecl *sc_FDICreate)(PFNALLOC, PFNFREE, PFNOPEN, - PFNREAD, PFNWRITE, PFNCLOSE, PFNSEEK, int, PERF); - -static BOOL (__cdecl *sc_FDICopy)(HFDI, char *, char *, int, - PFNFDINOTIFY, PFNFDIDECRYPT, void *); - -static BOOL (__cdecl *sc_FDIDestroy)(HFDI); - -#define SC_HSC_A_MAGIC 0xACABFEED -typedef struct { - UINT magic; - HFDI hfdi; - PSP_FILE_CALLBACK_A msghandler; - PVOID context; - CHAR most_recent_cabinet_name[MAX_PATH]; -} SC_HSC_A, *PSC_HSC_A; - -#define SC_HSC_W_MAGIC 0x0CABFEED -typedef struct { - UINT magic; - HFDI hfdi; - PSP_FILE_CALLBACK_W msghandler; - PVOID context; - WCHAR most_recent_cabinet_name[MAX_PATH]; -} SC_HSC_W, *PSC_HSC_W; - -WINE_DEFAULT_DEBUG_CHANNEL(setupapi); - -static BOOL LoadCABINETDll(void) -{ - if (!CABINET_hInstance) { - CABINET_hInstance = LoadLibraryA("cabinet.dll"); - if (CABINET_hInstance) { - sc_FDICreate = (void *)GetProcAddress(CABINET_hInstance, "FDICreate"); - sc_FDICopy = (void *)GetProcAddress(CABINET_hInstance, "FDICopy"); - sc_FDIDestroy = (void *)GetProcAddress(CABINET_hInstance, "FDIDestroy"); - return TRUE; - } else { - ERR("load cabinet dll failed.\n"); - return FALSE; - } - } else - return TRUE; -} - -static void UnloadCABINETDll(void) -{ - if (CABINET_hInstance) { - FreeLibrary(CABINET_hInstance); - CABINET_hInstance = 0; - } -} - -/* FDICreate callbacks */ - -static void *sc_cb_alloc(ULONG cb) -{ - return malloc(cb); -} - -static void sc_cb_free(void *pv) -{ - free(pv); -} - -static INT_PTR sc_cb_open(char *pszFile, int oflag, int pmode) -{ - DWORD creation = 0, sharing = 0; - int ioflag = 0; - INT_PTR ret = 0; - SECURITY_ATTRIBUTES sa; - - /* TRACE("(pszFile == %s, oflag == %d, pmode == %d)\n", debugstr_a(pszFile), oflag, pmode); */ - - switch(oflag & (_O_RDONLY | _O_WRONLY | _O_RDWR)) { - case _O_RDONLY: - ioflag |= GENERIC_READ; - break; - case _O_WRONLY: - ioflag |= GENERIC_WRITE; - break; - case _O_RDWR: - ioflag |= GENERIC_READ & GENERIC_WRITE; - break; - case _O_WRONLY | _O_RDWR: /* hmmm.. */ - ERR("_O_WRONLY & _O_RDWR in oflag?\n"); - return -1; - } - - if (oflag & _O_CREAT) { - if (oflag & _O_EXCL) - creation = CREATE_NEW; - else if (oflag & _O_TRUNC) - creation = CREATE_ALWAYS; - else - creation = OPEN_ALWAYS; - } else /* no _O_CREAT */ { - if (oflag & _O_TRUNC) - creation = TRUNCATE_EXISTING; - else - creation = OPEN_EXISTING; - } - - switch( pmode & 0x70 ) { - case _SH_DENYRW: - sharing = 0L; - break; - case _SH_DENYWR: - sharing = FILE_SHARE_READ; - break; - case _SH_DENYRD: - sharing = FILE_SHARE_WRITE; - break; - case _SH_COMPAT: - case _SH_DENYNO: - sharing = FILE_SHARE_READ | FILE_SHARE_WRITE; - break; - default: - ERR("<-- -1 (Unhandled pmode 0x%x)\n", pmode); - return -1; - } - - if (oflag & ~(_O_BINARY | _O_TRUNC | _O_EXCL | _O_CREAT | _O_RDWR | _O_WRONLY | _O_NOINHERIT)) - WARN("unsupported oflag 0x%04x\n",oflag); - - sa.nLength = sizeof( SECURITY_ATTRIBUTES ); - sa.lpSecurityDescriptor = NULL; - sa.bInheritHandle = (ioflag & _O_NOINHERIT) ? FALSE : TRUE; - - ret = (INT_PTR) CreateFileA(pszFile, ioflag, sharing, &sa, creation, FILE_ATTRIBUTE_NORMAL, NULL); - - /* TRACE("<-- %d\n", ret); */ - - return ret; -} - -static UINT sc_cb_read(INT_PTR hf, void *pv, UINT cb) -{ - DWORD num_read; - BOOL rslt; - - /* TRACE("(hf == %d, pv == ^%p, cb == %u)\n", hf, pv, cb); */ - - rslt = ReadFile((HANDLE) hf, pv, cb, &num_read, NULL); - - - /* eof and failure both give "-1" return */ - if ((! rslt) || ((cb > 0) && (num_read == 0))) { - /* TRACE("<-- -1\n"); */ - return -1; - } - - /* TRACE("<-- %lu\n", num_read); */ - return num_read; -} - -static UINT sc_cb_write(INT_PTR hf, void *pv, UINT cb) -{ - DWORD num_written; - /* BOOL rv; */ - - /* TRACE("(hf == %d, pv == ^%p, cb == %u)\n", hf, pv, cb); */ - - if ( /* (rv = */ WriteFile((HANDLE) hf, pv, cb, &num_written, NULL) /* ) */ - && (num_written == cb)) { - /* TRACE("<-- %lu\n", num_written); */ - return num_written; - } else { - /* TRACE("rv == %d, num_written == %lu, cb == %u\n", rv, num_written,cb); */ - /* TRACE("<-- -1\n"); */ - return -1; - } -} - -static int sc_cb_close(INT_PTR hf) -{ - /* TRACE("(hf == %d)\n", hf); */ - - if (CloseHandle((HANDLE) hf)) - return 0; - else - return -1; -} - -static long sc_cb_lseek(INT_PTR hf, long dist, int seektype) -{ - DWORD ret; - - /* TRACE("(hf == %d, dist == %ld, seektype == %d)\n", hf, dist, seektype); */ - - if (seektype < 0 || seektype > 2) - return -1; - - if (((ret = SetFilePointer((HANDLE) hf, dist, NULL, seektype)) != INVALID_SET_FILE_POINTER) || !GetLastError()) { - /* TRACE("<-- %lu\n", ret); */ - return ret; - } else { - /* TRACE("<-- -1\n"); */ - return -1; - } -} - -#define SIZEOF_MYSTERIO (MAX_PATH*3) - -/* FDICopy callbacks */ - -static INT_PTR sc_FNNOTIFY_A(FDINOTIFICATIONTYPE fdint, PFDINOTIFICATION pfdin) -{ - FILE_IN_CABINET_INFO_A fici; - PSC_HSC_A phsc; - CABINET_INFO_A ci; - FILEPATHS_A fp; - UINT err; - - CHAR mysterio[SIZEOF_MYSTERIO]; /* how big? undocumented! probably 256... */ - - memset(&(mysterio[0]), 0, SIZEOF_MYSTERIO); - - TRACE("(fdint == %d, pfdin == ^%p)\n", fdint, pfdin); - - if (pfdin && pfdin->pv && (*((void **) pfdin->pv) == (void *)SC_HSC_A_MAGIC)) - phsc = (PSC_HSC_A) pfdin->pv; - else { - ERR("pv %p is not an SC_HSC_A.\n", (pfdin) ? pfdin->pv : NULL); - return -1; - } - - switch (fdint) { - case fdintCABINET_INFO: - TRACE("Cabinet info notification\n"); - /* TRACE(" Cabinet name: %s\n", debugstr_a(pfdin->psz1)); - TRACE(" Cabinet disk: %s\n", debugstr_a(pfdin->psz2)); - TRACE(" Cabinet path: %s\n", debugstr_a(pfdin->psz3)); - TRACE(" Cabinet Set#: %d\n", pfdin->setID); - TRACE(" Cabinet Cab#: %d\n", pfdin->iCabinet); */ - WARN("SPFILENOTIFY_CABINETINFO undocumented: guess implementation.\n"); - ci.CabinetFile = &(phsc->most_recent_cabinet_name[0]); - ci.CabinetPath = pfdin->psz3; - ci.DiskName = pfdin->psz2; - ci.SetId = pfdin->setID; - ci.CabinetNumber = pfdin->iCabinet; - phsc->msghandler(phsc->context, SPFILENOTIFY_CABINETINFO, (UINT) &ci, 0); - return 0; - case fdintPARTIAL_FILE: - TRACE("Partial file notification\n"); - /* TRACE(" Partial file name: %s\n", debugstr_a(pfdin->psz1)); */ - return 0; - case fdintCOPY_FILE: - TRACE("Copy file notification\n"); - TRACE(" File name: %s\n", debugstr_a(pfdin->psz1)); - /* TRACE(" File size: %ld\n", pfdin->cb); - TRACE(" File date: %u\n", pfdin->date); - TRACE(" File time: %u\n", pfdin->time); - TRACE(" File attr: %u\n", pfdin->attribs); */ - fici.NameInCabinet = pfdin->psz1; - fici.FileSize = pfdin->cb; - fici.Win32Error = 0; - fici.DosDate = pfdin->date; - fici.DosTime = pfdin->time; - fici.DosAttribs = pfdin->attribs; - memset(&(fici.FullTargetName[0]), 0, MAX_PATH); - err = phsc->msghandler(phsc->context, SPFILENOTIFY_FILEINCABINET, - (UINT) &fici, (UINT) pfdin->psz1); - if (err == FILEOP_DOIT) { - TRACE(" Callback specified filename: %s\n", debugstr_a(&(fici.FullTargetName[0]))); - if (!fici.FullTargetName[0]) { - WARN(" Empty return string causing abort."); - SetLastError(ERROR_PATH_NOT_FOUND); - return -1; - } - return sc_cb_open(&(fici.FullTargetName[0]), _O_BINARY | _O_CREAT | _O_WRONLY, _S_IREAD | _S_IWRITE); - } else { - TRACE(" Callback skipped file.\n"); - return 0; - } - case fdintCLOSE_FILE_INFO: - TRACE("Close file notification\n"); - /* TRACE(" File name: %s\n", debugstr_a(pfdin->psz1)); - TRACE(" Exec file? %s\n", (pfdin->cb) ? "Yes" : "No"); - TRACE(" File hndl: %d\n", pfdin->hf); */ - fp.Source = &(phsc->most_recent_cabinet_name[0]); - fp.Target = pfdin->psz1; - fp.Win32Error = 0; - fp.Flags = 0; - /* the following should be a fixme -- but it occurs too many times */ - WARN("Should set file date/time/attribs (and execute files?)\n"); - err = phsc->msghandler(phsc->context, SPFILENOTIFY_FILEEXTRACTED, (UINT) &fp, 0); - if (sc_cb_close(pfdin->hf)) - WARN("_close failed.\n"); - if (err) { - SetLastError(err); - return FALSE; - } else - return TRUE; - case fdintNEXT_CABINET: - TRACE("Next cabinet notification\n"); - /* TRACE(" Cabinet name: %s\n", debugstr_a(pfdin->psz1)); - TRACE(" Cabinet disk: %s\n", debugstr_a(pfdin->psz2)); - TRACE(" Cabinet path: %s\n", debugstr_a(pfdin->psz3)); - TRACE(" Cabinet Set#: %d\n", pfdin->setID); - TRACE(" Cabinet Cab#: %d\n", pfdin->iCabinet); */ - ci.CabinetFile = pfdin->psz1; - ci.CabinetPath = pfdin->psz3; - ci.DiskName = pfdin->psz2; - ci.SetId = pfdin->setID; - ci.CabinetNumber = pfdin->iCabinet; - /* remember the new cabinet name */ - strcpy(&(phsc->most_recent_cabinet_name[0]), pfdin->psz1); - err = phsc->msghandler(phsc->context, SPFILENOTIFY_NEEDNEWCABINET, (UINT) &ci, (UINT) &(mysterio[0])); - if (err) { - SetLastError(err); - return -1; - } else { - if (mysterio[0]) { - /* some easy paranoia. no such carefulness exists on the wide API IIRC */ - mysterio[SIZEOF_MYSTERIO - 1] = '\0'; - strncpy(pfdin->psz3, &(mysterio[0]), 255); - mysterio[255] = '\0'; - } - return 0; - } - default: - FIXME("Unknown notification type %d.\n", fdint); - return 0; - } -} - -static INT_PTR sc_FNNOTIFY_W(FDINOTIFICATIONTYPE fdint, PFDINOTIFICATION pfdin) -{ - FILE_IN_CABINET_INFO_W fici; - PSC_HSC_W phsc; - CABINET_INFO_W ci; - FILEPATHS_W fp; - UINT err; - int len; - - WCHAR mysterio[SIZEOF_MYSTERIO]; /* how big? undocumented! */ - WCHAR buf[MAX_PATH], buf2[MAX_PATH]; - CHAR charbuf[MAX_PATH]; - - memset(&(mysterio[0]), 0, SIZEOF_MYSTERIO * sizeof(WCHAR)); - memset(&(buf[0]), 0, MAX_PATH * sizeof(WCHAR)); - memset(&(buf2[0]), 0, MAX_PATH * sizeof(WCHAR)); - memset(&(charbuf[0]), 0, MAX_PATH); - - TRACE("(fdint == %d, pfdin == ^%p)\n", fdint, pfdin); - - if (pfdin && pfdin->pv && (*((void **) pfdin->pv) == (void *)SC_HSC_W_MAGIC)) - phsc = (PSC_HSC_W) pfdin->pv; - else { - ERR("pv %p is not an SC_HSC_W.\n", (pfdin) ? pfdin->pv : NULL); - return -1; - } - - switch (fdint) { - case fdintCABINET_INFO: - TRACE("Cabinet info notification\n"); - /* TRACE(" Cabinet name: %s\n", debugstr_a(pfdin->psz1)); - TRACE(" Cabinet disk: %s\n", debugstr_a(pfdin->psz2)); - TRACE(" Cabinet path: %s\n", debugstr_a(pfdin->psz3)); - TRACE(" Cabinet Set#: %d\n", pfdin->setID); - TRACE(" Cabinet Cab#: %d\n", pfdin->iCabinet); */ - WARN("SPFILENOTIFY_CABINETINFO undocumented: guess implementation.\n"); - ci.CabinetFile = &(phsc->most_recent_cabinet_name[0]); - len = 1 + MultiByteToWideChar(CP_ACP, 0, pfdin->psz3, -1, &(buf[0]), MAX_PATH); - if ((len > MAX_PATH) || (len <= 1)) - buf[0] = '\0'; - ci.CabinetPath = &(buf[0]); - len = 1 + MultiByteToWideChar(CP_ACP, 0, pfdin->psz2, -1, &(buf2[0]), MAX_PATH); - if ((len > MAX_PATH) || (len <= 1)) - buf2[0] = '\0'; - ci.DiskName = &(buf2[0]); - ci.SetId = pfdin->setID; - ci.CabinetNumber = pfdin->iCabinet; - phsc->msghandler(phsc->context, SPFILENOTIFY_CABINETINFO, (UINT) &ci, 0); - return 0; - case fdintPARTIAL_FILE: - TRACE("Partial file notification\n"); - /* TRACE(" Partial file name: %s\n", debugstr_a(pfdin->psz1)); */ - return 0; - case fdintCOPY_FILE: - TRACE("Copy file notification\n"); - TRACE(" File name: %s\n", debugstr_a(pfdin->psz1)); - /* TRACE(" File size: %ld\n", pfdin->cb); - TRACE(" File date: %u\n", pfdin->date); - TRACE(" File time: %u\n", pfdin->time); - TRACE(" File attr: %u\n", pfdin->attribs); */ - len = 1 + MultiByteToWideChar(CP_ACP, 0, pfdin->psz1, -1, &(buf2[0]), MAX_PATH); - if ((len > MAX_PATH) || (len <= 1)) - buf2[0] = '\0'; - fici.NameInCabinet = &(buf2[0]); - fici.FileSize = pfdin->cb; - fici.Win32Error = 0; - fici.DosDate = pfdin->date; - fici.DosTime = pfdin->time; - fici.DosAttribs = pfdin->attribs; - memset(&(fici.FullTargetName[0]), 0, MAX_PATH * sizeof(WCHAR)); - err = phsc->msghandler(phsc->context, SPFILENOTIFY_FILEINCABINET, - (UINT) &fici, (UINT) pfdin->psz1); - if (err == FILEOP_DOIT) { - TRACE(" Callback specified filename: %s\n", debugstr_w(&(fici.FullTargetName[0]))); - if (fici.FullTargetName[0]) { - len = strlenW(&(fici.FullTargetName[0])) + 1; - if ((len > MAX_PATH ) || (len <= 1)) - return 0; - if (!WideCharToMultiByte(CP_ACP, 0, &(fici.FullTargetName[0]), len, &(charbuf[0]), MAX_PATH, 0, 0)) - return 0; - } else { - WARN("Empty buffer string caused abort.\n"); - SetLastError(ERROR_PATH_NOT_FOUND); - return -1; - } - return sc_cb_open(&(charbuf[0]), _O_BINARY | _O_CREAT | _O_WRONLY, _S_IREAD | _S_IWRITE); - } else { - TRACE(" Callback skipped file.\n"); - return 0; - } - case fdintCLOSE_FILE_INFO: - TRACE("Close file notification\n"); - /* TRACE(" File name: %s\n", debugstr_a(pfdin->psz1)); - TRACE(" Exec file? %s\n", (pfdin->cb) ? "Yes" : "No"); - TRACE(" File hndl: %d\n", pfdin->hf); */ - fp.Source = &(phsc->most_recent_cabinet_name[0]); - len = 1 + MultiByteToWideChar(CP_ACP, 0, pfdin->psz1, -1, &(buf[0]), MAX_PATH); - if ((len > MAX_PATH) || (len <= 1)) - buf[0] = '\0'; - fp.Target = &(buf[0]); - fp.Win32Error = 0; - fp.Flags = 0; - /* a valid fixme -- but occurs too many times */ - /* FIXME("Should set file date/time/attribs (and execute files?)\n"); */ - err = phsc->msghandler(phsc->context, SPFILENOTIFY_FILEEXTRACTED, (UINT) &fp, 0); - if (sc_cb_close(pfdin->hf)) - WARN("_close failed.\n"); - if (err) { - SetLastError(err); - return FALSE; - } else - return TRUE; - case fdintNEXT_CABINET: - TRACE("Next cabinet notification\n"); - /* TRACE(" Cabinet name: %s\n", debugstr_a(pfdin->psz1)); - TRACE(" Cabinet disk: %s\n", debugstr_a(pfdin->psz2)); - TRACE(" Cabinet path: %s\n", debugstr_a(pfdin->psz3)); - TRACE(" Cabinet Set#: %d\n", pfdin->setID); - TRACE(" Cabinet Cab#: %d\n", pfdin->iCabinet); */ - /* remember the new cabinet name */ - len = 1 + MultiByteToWideChar(CP_ACP, 0, pfdin->psz1, -1, &(phsc->most_recent_cabinet_name[0]), MAX_PATH); - if ((len > MAX_PATH) || (len <= 1)) - phsc->most_recent_cabinet_name[0] = '\0'; - ci.CabinetFile = &(phsc->most_recent_cabinet_name[0]); - len = 1 + MultiByteToWideChar(CP_ACP, 0, pfdin->psz3, -1, &(buf[0]), MAX_PATH); - if ((len > MAX_PATH) || (len <= 1)) - buf[0] = '\0'; - ci.CabinetPath = &(buf[0]); - len = 1 + MultiByteToWideChar(CP_ACP, 0, pfdin->psz2, -1, &(buf2[0]), MAX_PATH); - if ((len > MAX_PATH) || (len <= 1)) - buf2[0] = '\0'; - ci.DiskName = &(buf2[0]); - ci.SetId = pfdin->setID; - ci.CabinetNumber = pfdin->iCabinet; - err = phsc->msghandler(phsc->context, SPFILENOTIFY_NEEDNEWCABINET, (UINT) &ci, (UINT) &(mysterio[0])); - if (err) { - SetLastError(err); - return -1; - } else { - if (mysterio[0]) { - len = strlenW(&(mysterio[0])) + 1; - if ((len > 255) || (len <= 1)) - return 0; - if (!WideCharToMultiByte(CP_ACP, 0, &(mysterio[0]), len, pfdin->psz3, 255, 0, 0)) - return 0; - } - return 0; - } - default: - FIXME("Unknown notification type %d.\n", fdint); - return 0; - } -} - -/*********************************************************************** - * SetupIterateCabinetA (SETUPAPI.@) - */ -BOOL WINAPI SetupIterateCabinetA(PCSTR CabinetFile, DWORD Reserved, - PSP_FILE_CALLBACK_A MsgHandler, PVOID Context) -{ - - SC_HSC_A my_hsc; - ERF erf; - CHAR pszCabinet[MAX_PATH], pszCabPath[MAX_PATH], *p; - DWORD fpnsize; - BOOL ret; - - - TRACE("(CabinetFile == %s, Reserved == %lu, MsgHandler == ^%p, Context == ^%p)\n", - debugstr_a(CabinetFile), Reserved, MsgHandler, Context); - - if (! LoadCABINETDll()) - return FALSE; - - memset(&my_hsc, 0, sizeof(SC_HSC_A)); - pszCabinet[0] = '\0'; - pszCabPath[0] = '\0'; - - fpnsize = strlen(CabinetFile); - if (fpnsize >= MAX_PATH) { - SetLastError(ERROR_BAD_PATHNAME); - return FALSE; - } - - fpnsize = GetFullPathNameA(CabinetFile, MAX_PATH, &(pszCabPath[0]), &p); - if (fpnsize > MAX_PATH) { - SetLastError(ERROR_BAD_PATHNAME); - return FALSE; - } - - if (p) { - strcpy(pszCabinet, p); - *p = '\0'; - } else { - strcpy(pszCabinet, CabinetFile); - pszCabPath[0] = '\0'; - } - - TRACE("path: %s, cabfile: %s\n", debugstr_a(pszCabPath), debugstr_a(pszCabinet)); - - /* remember the cabinet name */ - strcpy(&(my_hsc.most_recent_cabinet_name[0]), pszCabinet); - - my_hsc.magic = SC_HSC_A_MAGIC; - my_hsc.msghandler = MsgHandler; - my_hsc.context = Context; - my_hsc.hfdi = sc_FDICreate( sc_cb_alloc, sc_cb_free, sc_cb_open, sc_cb_read, - sc_cb_write, sc_cb_close, sc_cb_lseek, cpuUNKNOWN, &erf ); - - if (!my_hsc.hfdi) return FALSE; - - ret = ( sc_FDICopy(my_hsc.hfdi, pszCabinet, pszCabPath, - 0, sc_FNNOTIFY_A, NULL, &my_hsc) ) ? TRUE : FALSE; - - sc_FDIDestroy(my_hsc.hfdi); - return ret; -} - -/*********************************************************************** - * SetupIterateCabinetW (SETUPAPI.@) - */ -BOOL WINAPI SetupIterateCabinetW(PCWSTR CabinetFile, DWORD Reserved, - PSP_FILE_CALLBACK_W MsgHandler, PVOID Context) -{ - CHAR CabinetFile_A[MAX_PATH]; - unsigned int len; - SC_HSC_W my_hsc; - ERF erf; - CHAR pszCabinet[MAX_PATH], pszCabPath[MAX_PATH], *p; - DWORD fpnsize; - BOOL ret; - - TRACE("(CabinetFile == %s, Reserved == %lu, MsgHandler == ^%p, Context == ^%p)\n", - debugstr_w(CabinetFile), Reserved, MsgHandler, Context); - - if (!LoadCABINETDll()) - return FALSE; - - if (!CabinetFile) return FALSE; - if (!WideCharToMultiByte(CP_ACP, 0, CabinetFile, -1, CabinetFile_A, MAX_PATH, 0, 0)) - return FALSE; - - memset(&my_hsc, 0, sizeof(SC_HSC_W)); - pszCabinet[0] = '\0'; - pszCabPath[0] = '\0'; - - fpnsize = GetFullPathNameA(CabinetFile_A, MAX_PATH, &(pszCabPath[0]), &p); - if (fpnsize > MAX_PATH) { - SetLastError(ERROR_BAD_PATHNAME); - return FALSE; - } - - if (p) { - strcpy(pszCabinet, p); - *p = '\0'; - } else { - strcpy(pszCabinet, CabinetFile_A); - pszCabPath[0] = '\0'; - } - - TRACE("path: %s, cabfile: %s\n", debugstr_a(pszCabPath), debugstr_a(pszCabinet)); - - /* remember the cabinet name */ - len = 1 + MultiByteToWideChar(CP_ACP, 0, pszCabinet, -1, - &(my_hsc.most_recent_cabinet_name[0]), MAX_PATH); - if (len > MAX_PATH) - return FALSE; - else if (len <= 1) - my_hsc.most_recent_cabinet_name[0] = '\0'; - my_hsc.magic = SC_HSC_W_MAGIC; - my_hsc.msghandler = MsgHandler; - my_hsc.context = Context; - my_hsc.hfdi = sc_FDICreate( sc_cb_alloc, sc_cb_free, sc_cb_open, sc_cb_read, - sc_cb_write, sc_cb_close, sc_cb_lseek, cpuUNKNOWN, &erf ); - - if (!my_hsc.hfdi) return FALSE; - - ret = ( sc_FDICopy(my_hsc.hfdi, pszCabinet, pszCabPath, - 0, sc_FNNOTIFY_W, NULL, &my_hsc) ) ? TRUE : FALSE; - - sc_FDIDestroy(my_hsc.hfdi); - return ret; -} - - -/*********************************************************************** - * DllMain - * - * PARAMS - * hinstDLL [I] handle to the DLL's instance - * fdwReason [I] - * lpvReserved [I] reserved, must be NULL - * - * RETURNS - * Success: TRUE - * Failure: FALSE - */ - -BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) -{ - switch (fdwReason) { - case DLL_PROCESS_ATTACH: - DisableThreadLibraryCalls(hinstDLL); - break; - case DLL_PROCESS_DETACH: - UnloadCABINETDll(); - break; - } - - return TRUE; -} diff --git a/reactos/lib/setupapi/setupx.spec b/reactos/lib/setupapi/setupx.spec deleted file mode 100644 index be6bcfd640f..00000000000 --- a/reactos/lib/setupapi/setupx.spec +++ /dev/null @@ -1,269 +0,0 @@ -1 stub WEP -2 pascal -ret16 IpOpen(str ptr) IpOpen16 -3 stub IpOpenAppend #(str word) -4 pascal -ret16 IpClose(word) IpClose16 -5 stub IpGetLongField #(word ptr word ptr) -6 stub IpGetStringField #(word ptr word ptr word ptr) -7 stub IpFindFirstLine #(word str str ptr) -8 stub IpGetLineCount #(word str ptr) -9 stub IpGetFieldCount #(word ptr ptr) -10 stub IpGetIntField #(word ptr word ptr) -11 stub IpFindNextLine #(word ptr) -12 stub IpGetFileName #(word ptr word) -13 pascal -ret16 VcpQueueCopy(str str str str word word ptr word long) VcpQueueCopy16 -14 stub NOAUTORUNWNDPROC -15 stub __DEBUGMSG -16 stub __ASSERTMSG -17 pascal -ret16 VcpQueueDelete(str str word long) VcpQueueDelete16 -18 stub TpOpenFile #(str ptr word) -19 stub TpCloseFile #(word) -20 stub TpOpenSection #(word ptr str word) -21 stub TpCloseSection #(word) -22 stub TpCommitSection #(word word str word) -23 stub TpGetLine #(word str str word word ptr) -24 stub TpGetNextLine #(word str str ptr) -25 stub TpInsertLine #(word str str word word word) -26 stub TpReplaceLine #(word str str word word word) -27 stub TpDeleteLine #(word word word word) -28 stub TpMoveLine #(word word word word word word) -29 stub TpGetLineContents #(word ptr word ptr word word word) -30 stub TpGetPrivateProfileString #(str str str ptr word str) -31 stub TpWritePrivateProfileString #(str str str str) -32 stub TpGetProfileString #(str str str ptr word) -33 pascal -ret16 CtlSetLdd(ptr) CtlSetLdd16 -34 pascal -ret16 CtlGetLdd(ptr) CtlGetLdd16 -35 pascal -ret16 CtlFindLdd(ptr) CtlFindLdd16 -36 pascal -ret16 CtlAddLdd(ptr) CtlAddLdd16 -37 pascal -ret16 CtlDelLdd(word) CtlDelLdd16 -38 pascal -ret16 CtlGetLddPath(word ptr) CtlGetLddPath16 -39 stub SURegCloseKey #(word) -40 stub SURegCreateKey #(word) -41 stub SURegDeleteKey #(word str) -42 stub SURegDeleteValue #(word str) -43 stub SURegEnumKey #(word long ptr long) -44 stub SURegEnumValue #(word long str ptr ptr ptr ptr ptr) -45 stub SURegFlush #() -46 stub SURegInit #() -47 pascal SURegOpenKey(word str ptr) SURegOpenKey -48 stub SURegQueryValue -49 stub SURegQueryValue16 #(word str ptr ptr) -50 pascal SURegQueryValueEx(long str ptr ptr ptr ptr) SURegQueryValueEx -51 stub SURegSetValue -52 stub SURegSetValue16 #(word str long ptr long) -53 stub SURegSetValueEx #(word str long long ptr long) -54 stub SURegSaveKey #(word str ptr) -55 stub SURegLoadKey #(word str str) -56 stub SURegUnLoadKey #(word str) -60 stub DiskInfoFromLdid #(word ptr) -61 pascal suErrorToIds(word word) suErrorToIds16 -62 pascal -ret16 TPWriteProfileString(str str str) TPWriteProfileString16 -63 stub SURPLSETUP -# does SUSTORELDIDPATH set the path of an LDID in the registry ? -64 stub SUSTORELDIDPATH -65 stub WILDCARDSTRCMPI -101 pascal -ret16 GenInstall(word str word) GenInstall16 -102 stub GenWinInitRename #(str str word) -103 pascal GenFormStrWithoutPlaceHolders(str str word) GenFormStrWithoutPlaceHolders16 -104 stub SETUPX -105 stub CfgSetupMerge #(word) -106 stub INITDEPENDANTLDIDS -107 stub CFGOBJFINDKEYCMD -108 stub GenSURegSetValueEx -109 stub GENINSTALLWITHQUEUE -110 stub GenInstallEx #(word str word word ptr long) -111 stub GenCopyLogConfig2Reg #(word word str) -112 stub SUGetSetSetupFlags #(ptr word) -114 stub CFGPARSELINE # returns array -115 stub CFGSETAUTOPROCESS -116 stub CFGOBJTOSTR -117 stub CFGLNTOOBJ -118 stub MATCHCMDEXT -119 stub IpFindNextMatchLine #(word str ptr) -120 stub P_SETDEFAULTOPTION -121 stub CFGCLEANBOOT -122 stub CFGMATCHCMDEXT -123 stub CFGWASFILEUPDATED -124 stub AUTOMATCHCMDEXT -125 stub P_VALIDATEOC -126 stub GENMAPROOTREGSTR2KEY -127 stub P_CDROMOC -128 stub P_MEDIAOC -129 stub CFGCLEAN1STBOOT -130 stub suFormatMessage -131 stub suvFormatMessage #(word str str word ptr) -132 stub suFormatMessageBox -#133 stub suHelp # W98SE conflict !! -135 stub suHelp #(word word) -#135 stub P_WEBTVOC # W98SE conflict !! -136 stub P_WBEMOC -137 stub P_THEMESOC -138 stub P_IMAGINGOC -139 stub P_SCHEMESOC -140 stub suVerConflict #(word ptr word ptr) -141 stub suVerConflictInit #(word) -142 stub suVerConflictTerm #(ptr) -# Emergency Boot Disk -143 stub suCreateEBD #(word ptr long) -144 stub suCopyToEBD -145 stub sxIsMSDOS7Running #() -150 stub DS_INIT -151 stub DS_DESTROY -152 stub DS_SSYNCDRIVES -153 stub DS_GETDRIVEDATA -154 stub DS_ADDSECTION -155 stub DS_ENABLESECTION -156 stub DS_DISABLESECTION -157 stub DS_SETSWAPSIZE -158 stub DS_SETREQUIREDPAD -159 stub DS_SETAVAILABLEPAD -160 stub SXUPDATEDS -170 stub SUSETMEM -171 stub WriteDMFBootData #(word ptr word) -200 pascal VcpOpen(segptr ptr) VcpOpen16 -201 pascal VcpClose(word str) VcpClose16 -202 pascal -ret16 vcpDefCallbackProc(ptr word word long long) vcpDefCallbackProc16 -203 stub vcpEnumFiles #(ptr long) -204 pascal -ret16 VcpQueueRename(str str str str word word long) VcpQueueRename16 -205 pascal -ret16 vsmGetStringName(word ptr word) vsmGetStringName16 -206 pascal -ret16 vsmStringDelete(word) vsmStringDelete16 -207 pascal -ret16 vsmStringAdd(str) vsmStringAdd16 -208 pascal vsmGetStringRawName(word) vsmGetStringRawName16 -209 stub IpSaveRestorePosition #(word word) -210 pascal -ret16 IpGetProfileString(word str str ptr word) IpGetProfileString16 -211 stub IpOpenEx #(str ptr word) -212 stub IpOpenAppendEx #(str word word) -213 pascal -ret16 vcpUICallbackProc(ptr word word long long) vcpUICallbackProc16 -214 stub VcpAddMRUPath #(str) -300 pascal -ret16 DiBuildCompatDrvList (ptr) DiBuildCompatDrvList16 -301 pascal -ret16 DiBuildClassDrvList (ptr) DiBuildClassDrvList16 -302 stub DiDestroyDriverNodeList #(ptr) -303 pascal -ret16 DiCreateDeviceInfo (ptr str long long str str word) DiCreateDeviceInfo16 -304 pascal -ret16 DiGetClassDevs(ptr str word word) DiGetClassDevs16 -305 pascal -ret16 DiDestroyDeviceInfoList (ptr) DiDestroyDeviceInfoList16 -306 stub DiRemoveDevice #(ptr) -308 pascal -ret16 DiCallClassInstaller (word ptr) DiCallClassInstaller16 -309 stub DiCreateDriverNode #(ptr word word word str str str str str str long) -310 stub DiDrawMiniIcon -311 stub DiGetClassBitmapIndex #(str ptr) -312 stub DiSelectDevice #(ptr) -313 stub DiInstallDevice #(ptr) -314 stub DiLoadClassIcon #(str ptr ptr) -315 stub DiAskForOEMDisk #(ptr) -316 stub Display_SetMode #(ptr word word word) -317 stub Display_ClassInstaller #(word ptr) -318 pascal -ret16 DiCreateDevRegKey (ptr ptr word str word) DiCreateDevRegKey16 -319 pascal -ret16 DiOpenDevRegKey (ptr ptr word) DiOpenDevRegKey16 -320 stub DiInstallDrvSection #(str str str str long) -321 stub DiInstallClass #(str long) -322 stub DiOpenClassRegKey #(ptr str) -323 stub Display_SetFontSize #(str) -324 stub Display_OpenFontSizeKey #(ptr) -325 stub DiBuildClassDrvListFromOldInf #(ptr str ptr long) -326 stub DiIsThereNeedToCopy #(word long) -333 stub DiChangeState #(ptr long long long) -334 stub WALKSUBTREE -340 stub GetFctn #(word str str ptr ptr) -341 stub DiBuildClassInfoList #(ptr) -342 stub DiDestroyClassInfoList #(ptr) -343 stub DiGetDeviceClassInfo #(ptr ptr) -344 pascal -ret16 DiDeleteDevRegKey (ptr word) DiDeleteDevRegKey16 -350 stub DiSelectOEMDrv #(word ptr) -351 stub DiGetINFClass #(str word str long) -353 stub DIPICKBESTDRIVER -355 stub COPYINFFILE -360 stub GenInfLCToDevNode #(word str word word long) -361 stub GETDOSMESSAGE -362 stub Mouse_ClassInstaller #(word ptr) -363 stub sxCompareDosAppVer #(str str) -364 stub MONITOR_CLASSINSTALLER -365 stub FCEGETRESDESOFFSET -366 stub FCEGETALLOCVALUE -367 stub FCEADDRESDES -368 stub FCEDELETERESDES -369 stub FCEINIT -370 stub FCEGETRESDES -371 stub FCEGETFIRSTVALUE -372 stub FCEGETOTHERVALUE -373 stub FCEGETVALIDATEVALUE -374 stub FCEWRITETHISFORCEDCONFIGNOW -375 stub SUCreatePropertySheetPage #(ptr) -376 stub SUDestroyPropertySheetPage #(word) -377 stub SUPropertySheet #(ptr) -380 stub DiReadRegLogConf #(ptr str ptr ptr) -381 stub DiReadRegConf #(ptr ptr ptr long) -390 stub DiBuildPotentialDuplicatesList #(ptr ptr long ptr ptr) -395 stub InitSubstrData #(ptr str) -396 stub GetFirstSubstr #(ptr) -397 stub GetNextSubstr #(ptr) -398 stub INITSUBSTRDATAEX -400 stub bIsFileInVMM32 #(str) -401 stub DiInstallDriverFiles #(ptr) -405 stub DiBuildClassInfoListEx #(ptr long) -406 stub DiGetClassDevsEx #(ptr str str word word) -407 stub DiCopyRegSubKeyValue #(word str str str) -408 stub IPGETDRIVERDATE -409 stub IPGETDRIVERVERSION -410 stub IpGetVersionString #(str str ptr word str) -411 pascal VcpExplain(ptr long) VcpExplain16 -412 stub DiBuildDriverIndex #(word) -413 stub DiAddSingleInfToDrvIdx #(str word word) -414 stub FCEGETFLAGS -450 stub UiMakeDlgNonBold #(word) -451 stub UiDeleteNonBoldFont #(word) -500 stub SUEBDPAGE -501 stub SUOCPAGE -502 stub SXLISTSUBPROC -503 stub SXFILLLB -504 stub SXOCPAGEDLG -506 stub SXOCBATCHSETTINGS -507 stub SXOCFIXNEEDS -508 pascal -ret16 CtlSetLddPath(word str) CtlSetLddPath16 -509 stub SXCALLOCPROC -510 stub BUILDINFOCS -511 stub BUILDREGOCS -512 stub DELETEOCS -520 stub DiBuildClassDrvInfoList #(ptr) -521 stub DiBuildCompatDrvInfoList #(ptr) -522 stub DiDestroyDrvInfoList #(ptr) -523 stub DiConvertDriverInfoToDriverNode #(ptr ptr) -524 stub DISELECTBESTCOMPATDRV -525 stub FirstBootMoveToDOSSTART #(str word) -526 stub DOSOptEnableCurCfg #(str) -527 pascal -ret16 InstallHinfSection(word word str word) InstallHinfSection16 -528 stub SXMAKEUNCPATH -529 stub SXISSBSSERVERFILE -530 stub SXFINDBATCHFILES -531 stub ISPANEUROPEAN -532 stub UPGRADENIGGLINGS -533 stub DISPLAY_ISSECONDDISPLAY -534 stub ISWINDOWSFILE -540 stub VERIFYSELECTEDDRIVER -575 stub SXCALLMIGRATIONDLLS -576 stub SXCALLMIGRATIONDLLS_RUNDLL -600 stub PidConstruct #(str str str word) -601 stub PidValidate #(str str) -602 stub GETJAPANESEKEYBOARDTYPE -610 stub CRC32COMPUTE -621 stub SXSAVEINFO -622 stub SXADDPAGEEX -623 stub OPKREMOVEINSTALLEDNETDEVICE -640 stub DOFIRSTRUNSCREENS -700 stub SXSHOWREBOOTDLG -701 stub SXSHOWREBOOTDLG_RUNDLL -750 stub UIPOSITIONDIALOG -775 stub ASPICLEAN -800 stub EXTRACTCABFILE -825 stub PIDGEN3 -826 stub GETSETUPINFO -827 stub SETSETUPINFO -828 stub GETKEYBOARDOPTIONS -829 stub GETLOCALEOPTIONS -830 stub SETINTLOPTIONS -831 stub GETPRODUCTTYPE -832 stub ISOPKMODE -833 stub AUDITONETIMEINSTALL -834 stub DISKDUP -835 stub OPKPREINSTALL -836 stub ISAUDITMODE -837 stub ISAUDITAUTO -838 stub GETVALIDEULA diff --git a/reactos/lib/setupapi/setupx16.h b/reactos/lib/setupapi/setupx16.h deleted file mode 100644 index a7382127a00..00000000000 --- a/reactos/lib/setupapi/setupx16.h +++ /dev/null @@ -1,562 +0,0 @@ -/* - * Copyright 2000 Andreas Mohr for CodeWeavers - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef __SETUPX16_H -#define __SETUPX16_H - -#include "wine/windef16.h" - -typedef UINT16 HINF16; -typedef UINT16 LOGDISKID16; -typedef UINT16 VHSTR; - -#define LINE_LEN 256 - -/* error codes stuff */ - -typedef UINT16 RETERR16; -#define OK 0 -#define IP_ERROR (UINT16)100 -#define TP_ERROR (UINT16)200 -#define VCP_ERROR (UINT16)300 -#define GEN_ERROR (UINT16)400 -#define DI_ERROR (UINT16)500 - -enum { - ERR_IP_INVALID_FILENAME = IP_ERROR+1, - ERR_IP_ALLOC_ERR, - ERR_IP_INVALID_SECT_NAME, - ERR_IP_OUT_OF_HANDLES, - ERR_IP_INF_NOT_FOUND, - ERR_IP_INVALID_INFFILE, - ERR_IP_INVALID_HINF, - ERR_IP_INVALID_FIELD, - ERR_IP_SECT_NOT_FOUND, - ERR_IP_END_OF_SECTION, - ERR_IP_PROFILE_NOT_FOUND, - ERR_IP_LINE_NOT_FOUND, - ERR_IP_FILEREAD, - ERR_IP_TOOMANYINFFILES, - ERR_IP_INVALID_SAVERESTORE, - ERR_IP_INVALID_INFTYPE -}; - -/****** virtual copy operations ******/ - -typedef DWORD LPEXPANDVTBL; - -typedef struct { - DWORD dwSoFar; - DWORD dwTotal; -} VCPPROGRESS, *LPVCPPROGRESS; - -typedef struct { - WORD cbSize; - LOGDISKID16 ldid; - VHSTR vhstrRoot; - VHSTR vhstrVolumeLabel; - VHSTR vhstrDiskName; - WORD wVolumeTime; - WORD wVolumeDate; - DWORD dwSerialNumber; - WORD fl; - LPARAM lparamRef; - - VCPPROGRESS prgFileRead; - VCPPROGRESS prgByteRead; - - VCPPROGRESS prgFileWrite; - VCPPROGRESS prgByteWrite; -} VCPDISKINFO, *LPVCPDISKINFO; - -typedef struct { - LOGDISKID16 ldid; - VHSTR vhstrDir; - VHSTR vhstrFileName; -} VCPFILESPEC, *LPVCPFILESPEC; - -typedef struct { - UINT16 uiMDate; - UINT16 uiMTime; - UINT16 uiADate; - UINT16 uiATime; - UINT16 uiAttr; - DWORD llenIn; - DWORD llenOut; -} VCPFATTR, *LPVCPFATTR; - -typedef struct { - UINT16 uDate; - UINT16 uTime; - DWORD dwSize; -} VCPFILESTAT, *LPVCPFILESTAT; - -typedef struct -{ - HFILE16 hFileSrc; - HFILE16 hFileDst; - VCPFATTR fAttr; - WORD dosError; - VHSTR vhstrFileName; - WPARAM vcpm; -} VIRTNODEEX, *LPVIRTNODEEX; - -typedef struct { - WORD cbSize; - VCPFILESPEC vfsSrc; - VCPFILESPEC vfsDst; - WORD fl; - LPARAM lParam; - LPEXPANDVTBL lpExpandVtbl; - LPVIRTNODEEX lpvnex; - VHSTR vhstrDstFinalName; - VCPFILESTAT vFileStat; -} VIRTNODE, *LPVIRTNODE; - -typedef struct { - WORD cbSize; - VCPPROGRESS prgDiskRead; - VCPPROGRESS prgFileRead; - VCPPROGRESS prgByteRead; - - VCPPROGRESS prgDiskWrite; - VCPPROGRESS prgFileWrite; - VCPPROGRESS prgByteWrite; - - LPVCPDISKINFO lpvdiIn; - LPVCPDISKINFO lpvdiOut; - LPVIRTNODE lpvn; -} VCPSTATUS, *LPVCPSTATUS; - -#define CNFL_BACKUP 0x0001 -#define CNFL_DELETEONFAILURE 0x0002 -#define CNFL_RENAMEONSUCCESS 0x0004 -#define CNFL_CONTINUATION 0x0008 -#define CNFL_SKIPPED 0x0010 -#define CNFL_IGNOREERRORS 0x0020 -#define CNFL_RETRYFILE 0x0040 -#define CNFL_COPIED 0x0080 -#define VNFL_UNIQUE 0x0000 -#define VNFL_MULTIPLEOK 0x0100 -#define VNFL_DESTROYOLD 0x0200 -#define VNFL_COPY 0x0000 -#define VNFL_DELETE 0x0800 -#define VNFL_RENAME 0x1000 -#define VNFL_NODE_TYPE (VNFL_RENAME|VNFL_DELETE|VNFL_COPY) -#define VNFL_CREATED 0x2000 -#define VNFL_REJECTED 0x4000 -#define VNFL_DEVICEINSTALLER 0x8000 - -enum { - ERR_VCP_IOFAIL = VCP_ERROR+1, - ERR_VCP_STRINGTOOLONG, - ERR_VCP_NOMEM, - ERR_VCP_QUEUEFULL, - ERR_VCP_NOVHSTR, - ERR_VCP_OVERFLOW, - ERR_VCP_BADARG, - ERR_VCP_UNINIT, - ERR_VCP_NOTFOUND, - ERR_VCP_BUSY, - ERR_VCP_INTERRUPTED, - ERR_VCP_BADDEST, - ERR_VCP_SKIPPED, - ERR_VCP_IO, - ERR_VCP_LOCKED, - ERR_VCP_WRONGDISK, - ERR_VCP_CHANGEMODE, - ERR_VCP_LDDINVALID, - ERR_VCP_LDDFIND, - ERR_VCP_LDDUNINIT, - ERR_VCP_LDDPATH_INVALID, - ERR_VCP_NOEXPANSION, - ERR_VCP_NOTOPEN, - ERR_VCP_NO_DIGITAL_SIGNATURE_CATALOG, - ERR_VCP_NO_DIGITAL_SIGNATURE_FILE -}; - -#define VCPN_OK 0 -#define VCPN_PROCEED 0 -#define VCPN_ABORT -1 -#define VCPN_RETRY -2 -#define VCPN_IGNORE -3 -#define VCPN_SKIP -4 -#define VCPN_FORCE -5 -#define VCPN_DEFER -6 -#define VCPN_FAIL -7 -#define VCPN_RETRYFILE -8 - -#define VCPFL_ABANDON 0x00 -#define VCPFL_BACKUP 0x01 -#define VCPFL_COPY 0x02 -#define VCPFL_BACKUPANDCOPY (VCPFL_BACKUP|VCPFL_COPY) -#define VCPFL_INSPECIFIEDORDER 0x04 -#define VCPFL_DELETE 0x08 -#define VCPFL_RENAME 0x10 -#define VCPFL_ALL (VCPFL_COPY|VCPFL_DELETE|VCPFL_RENAME) - -#define CFNL_BACKUP 0x0001 -#define CFNL_DELETEONFAILURE 0x0002 -#define CFNL_RENAMEONSUCCESS 0x0004 -#define CFNL_CONTINUATION 0x0008 -#define CFNL_SKIPPED 0x0010 -#define CFNL_IGNOREERRORS 0x0020 -#define CFNL_RETRYFILE 0x0040 -#define CFNL_COPIED 0x0080 -#define VFNL_MULTIPLEOK 0x0100 -#define VFNL_DESTROYOLD 0x0200 -#define VFNL_NOW 0x0400 -#define VFNL_COPY 0x0000 -#define VFNL_DELETE 0x0800 -#define VFNL_RENAME 0x1000 -#define VFNL_CREATED 0x2000 -#define VFNL_REJECTED 0x4000 -#define VCPM_DISKCLASS 0x01 -#define VCPM_DISKFIRST 0x0100 -#define VCPM_DISKLAST 0x01ff - -enum { - VCPM_DISKCREATEINFO = VCPM_DISKFIRST, - VCPM_DISKGETINFO, - VCPM_DISKDESTROYINFO, - VCPM_DISKPREPINFO, - VCPM_DISKENSURE, - VCPM_DISKPROMPT, - VCPM_DISKFORMATBEGIN, - VCPM_DISKFORMATTING, - VCPM_DISKFORMATEND -}; - -#define VCPM_FILEINCLASS 0x02 -#define VCPM_FILEOUTCLASS 0x03 -#define VCPM_FILEFIRSTIN 0x0200 -#define VCPM_FILEFIRSTOUT 0x0300 -#define VCPM_FILELAST 0x03ff - -enum { - VCPM_FILEOPENIN = VCPM_FILEFIRSTIN, - VCPM_FILEGETFATTR, - VCPM_FILECLOSEIN, - VCPM_FILECOPY, - VCPM_FILENEEDED, - - VCPM_FILEOPENOUT = VCPM_FILEFIRSTOUT, - VCPM_FILESETFATTR, - VCPM_FILECLOSEOUT, - VCPM_FILEFINALIZE, - VCPM_FILEDELETE, - VCPM_FILERENAME -}; - -#define VCPM_NODECLASS 0x04 -#define VCPM_NODEFIRST 0x0400 -#define VCPM_NODELAST 0x04ff - -enum { - VCPM_NODECREATE = VCPM_NODEFIRST, - VCPM_NODEACCEPT, - VCPM_NODEREJECT, - VCPM_NODEDESTROY, - VCPM_NODECHANGEDESTDIR, - VCPM_NODECOMPARE -}; - -#define VCPM_TALLYCLASS 0x05 -#define VCPM_TALLYFIRST 0x0500 -#define VCPM_TALLYLAST 0x05ff - -enum { - VCPM_TALLYSTART = VCPM_TALLYFIRST, - VCPM_TALLYEND, - VCPM_TALLYFILE, - VCPM_TALLYDISK -}; - -#define VCPM_VERCLASS 0x06 -#define VCPM_VERFIRST 0x0600 -#define VCPM_VERLAST 0x06ff - -enum { - VCPM_VERCHECK = VCPM_VERFIRST, - VCPM_VERCHECKDONE, - VCPM_VERRESOLVECONFLICT -}; - -#define VCPM_VSTATCLASS 0x07 -#define VCPM_VSTATFIRST 0x0700 -#define VCPM_VSTATLAST 0x07ff - -enum { - VCPM_VSTATSTART = VCPM_VSTATFIRST, - VCPM_VSTATEND, - VCPM_VSTATREAD, - VCPM_VSTATWRITE, - VCPM_VSTATNEWDISK, - VCPM_VSTATCLOSESTART, - VCPM_VSTATCLOSEEND, - VCPM_VSTATBACKUPSTART, - VCPM_VSTATBACKUPEND, - VCPM_VSTATRENAMESTART, - VCPM_VSTATRENAMEEND, - VCPM_VSTATCOPYSTART, - VCPM_VSTATCOPYEND, - VCPM_VSTATDELETESTART, - VCPM_VSTATDELETEEND, - VCPM_VSTATPATHCHECKSTART, - VCPM_VSTATPATHCHECKEND, - VCPM_VSTATCERTIFYSTART, - VCPM_VSTATCERTIFYEND, - VCPM_VSTATUSERABORT, - VCPM_VSTATYIELD -}; - -#define VCPM_PATHCLASS 0x08 -#define VCPM_PATHFIRST 0x0800 -#define VCPM_PATHLAST 0x08ff - -enum { - VCPM_BUILDPATH = VCPM_PATHFIRST, - VCPM_UNIQUEPATH, - VCPM_CHECKPATH -}; - -#define VCPM_PATCHCLASS 0x09 -#define VCPM_PATCHFIRST 0x0900 -#define VCPM_PATCHLAST 0x09ff - -enum { - VCPM_FILEPATCHBEFORECPY = VCPM_PATCHFIRST, - VCPM_FILEPATCHAFTERCPY, - VCPM_FILEPATCHINFOPEN, - VCPM_FILEPATCHINFCLOSE -}; - -#define VCPM_CERTCLASS 0x0a -#define VCPM_CERTFIRST 0x0a00 -#define VCPM_CERTLAST 0x0aff - -enum { - VCPM_FILECERTIFY = VCPM_CERTFIRST, - VCPM_FILECERTIFYWARN -}; - -typedef LRESULT (CALLBACK *VIFPROC)(LPVOID lpvObj, UINT16 uMsg, WPARAM wParam, LPARAM lParam, LPARAM lparamRef); - -typedef int (CALLBACK *VCPENUMPROC)(LPVIRTNODE lpvn, LPARAM lparamRef); - -RETERR16 WINAPI VcpOpen16(VIFPROC vifproc, LPARAM lparamMsgRef); - -/* VcpQueueCopy flags */ -#define VNLP_SYSCRITICAL 0x0001 -#define VNLP_SETUPCRITICAL 0x0002 -#define VNLP_NOVERCHECK 0x0004 -#define VNLP_FORCETEMP 0x0008 -#define VNLP_IFEXISTS 0x0010 -#define VNLP_KEEPNEWER 0x0020 -#define VNLP_PATCHIFEXIST 0x0040 -#define VNLP_NOPATCH 0x0080 -#define VNLP_CATALOGCERT 0x0100 -#define VNLP_NEEDCERTIFY 0x0200 -#define VNLP_COPYIFEXISTS 0x0400 - -RETERR16 WINAPI VcpQueueCopy16( - LPCSTR lpszSrcFileName, LPCSTR lpszDstFileName, - LPCSTR lpszSrcDir, LPCSTR lpszDstDir, - LOGDISKID16 ldidSrc, LOGDISKID16 ldidDst, - LPEXPANDVTBL lpExpandVtbl, - WORD fl, LPARAM lParam -); -RETERR16 VcpFlush16(WORD fl, LPCSTR lpszBackupDest); -RETERR16 WINAPI VcpClose16(WORD fl, LPCSTR lpszBackupDest); - -/* VcpExplain flags */ -enum { - VCPEX_SRC_DISK, - VCPEX_SRC_CABINET, - VCPEX_SRC_LOCN, - VCPEX_DST_LOCN, - VCPEX_SRC_FILE, - VCPEX_DST_FILE, - VCPEX_DST_FILE_FINAL, - VCPEX_DOS_ERROR, - VCPEX_MESSAGE, - VCPEX_DOS_SOLUTION, - VCPEX_SRC_FULL, - VCPEX_DST_FULL, - VCPEX_DST_FULL_FINAL -}; - -LPCSTR WINAPI VcpExplain16(LPVIRTNODE lpVn, DWORD dwWhat); - -/****** logical disk management ******/ - -typedef struct _LOGDISKDESC_S { /* ldd */ - WORD cbSize; /* struct size */ - LOGDISKID16 ldid; /* logical disk ID */ - LPSTR pszPath; /* path this descriptor points to */ - LPSTR pszVolLabel; /* volume label of the disk related to it */ - LPSTR pszDiskName; /* name of this disk */ - WORD wVolTime; /* modification time of volume label */ - WORD wVolDate; /* modification date */ - DWORD dwSerNum; /* serial number of disk */ - WORD wFlags; -} LOGDISKDESC_S, *LPLOGDISKDESC; - -/** logical disk identifiers (LDID) **/ - -/* predefined LDIDs */ -#define LDID_PREDEF_START 0x0001 -#define LDID_PREDEF_END 0x7fff - -/* registry-assigned LDIDs */ -#define LDID_VAR_START 0x7000 -#define LDID_VAR_END 0x7fff - -/* dynamically assigned LDIDs */ -#define LDID_ASSIGN_START 0x8000 -#define LDID_ASSIGN_END 0xbfff - -#define LDID_NULL 0 -#define LDID_ABSOLUTE ((UINT)-1) -#define LDID_SRCPATH 1 /* setup source path */ -#define LDID_SETUPTEMP 2 /* setup temp dir */ -#define LDID_UNINSTALL 3 /* uninstall dir */ -#define LDID_BACKUP 4 /* backup dir */ -#define LDID_SETUPSCRATCH 5 /* setup scratch dir */ -#define LDID_WIN 10 /* win dir */ -#define LDID_SYS 11 /* win system dir */ -#define LDID_IOS 12 /* win Iosubsys dir */ -#define LDID_CMD 13 /* win command dir */ -#define LDID_CPL 14 /* win control panel dir */ -#define LDID_PRINT 15 /* win printer dir */ -#define LDID_MAIL 16 /* win mail dir */ -#define LDID_INF 17 /* win inf dir */ -#define LDID_HELP 18 /* win help dir */ -#define LDID_WINADMIN 19 /* admin dir */ -#define LDID_FONTS 20 /* win fonts dir */ -#define LDID_VIEWERS 21 /* win viewers dir */ -#define LDID_VMM32 22 /* win VMM32 dir */ -#define LDID_COLOR 23 /* win color mngment dir */ -#define LDID_APPS 24 /* win apps dir */ -#define LDID_SHARED 25 /* win shared dir */ -#define LDID_WINBOOT 26 /* guaranteed win boot drive */ -#define LDID_MACHINE 27 /* machine specific files */ -#define LDID_HOST_WINBOOT 28 -#define LDID_BOOT 30 /* boot drive root dir */ -#define LDID_BOOT_HOST 31 /* boot drive host root dir */ -#define LDID_OLD_WINBOOT 32 /* root subdir */ -#define LDID_OLD_WIN 33 /* old windows dir */ - -/* flags for GenInstall() */ -#define GENINSTALL_DO_FILES 1 -#define GENINSTALL_DO_INI 2 -#define GENINSTALL_DO_REG 4 -#define GENINSTALL_DO_INI2REG 8 -#define GENINSTALL_DO_CFGAUTO 16 -#define GENINSTALL_DO_LOGCONFIG 32 -#define GENINSTALL_DO_REGSRCPATH 64 -#define GENINSTALL_DO_PERUSER 128 - -#define GEINISTALL_DO_INIREG 14 -#define GENINSTALL_DO_ALL 255 - -/* - * flags for InstallHinfSection() - * 128 can be added, too. This means that the .inf file is provided by you - * instead of being a 32 bit file (i.e. Windows .inf file). - * In this case all files you install must be in the same dir - * as your .inf file on the install disk. - */ -#define HOW_NEVER_REBOOT 0 -#define HOW_ALWAYS_SILENT_REBOOT 1 -#define HOW_ALWAYS_PROMPT_REBOOT 2 -#define HOW_SILENT_REBOOT 3 -#define HOW_PROMPT_REBOOT 4 - -/****** device installation stuff ******/ - -#define MAX_CLASS_NAME_LEN 32 -#define MAX_DEVNODE_ID_LEN 256 -#define MAX_GUID_STR 50 - -typedef struct _DEVICE_INFO -{ - UINT16 cbSize; - struct _DEVICE_INFO *lpNextDi; - char szDescription[LINE_LEN]; - DWORD dnDevnode; - HKEY hRegKey; - char szRegSubkey[MAX_DEVNODE_ID_LEN]; - char szClassName[MAX_CLASS_NAME_LEN]; - DWORD Flags; - HWND16 hwndParent; - /*LPDRIVER_NODE*/ LPVOID lpCompatDrvList; - /*LPDRIVER_NODE*/ LPVOID lpClassDrvList; - /*LPDRIVER_NODE*/ LPVOID lpSelectedDriver; - ATOM atDriverPath; - ATOM atTempInfFile; - HINSTANCE16 hinstClassInstaller; - HINSTANCE16 hinstClassPropProvidor; - HINSTANCE16 hinstDevicePropProvidor; - HINSTANCE16 hinstBasicPropProvidor; - FARPROC16 fpClassInstaller; - FARPROC16 fpClassEnumPropPages; - FARPROC16 fpDeviceEnumPropPages; - FARPROC16 fpEnumBasicProperties; - DWORD dwSetupReserved; - DWORD dwClassInstallReserved; - /*GENCALLBACKPROC*/ LPVOID gicpGenInstallCallBack; - - LPARAM gicplParam; - UINT16 InfType; - - HINSTANCE16 hinstPrivateProblemHandler; - FARPROC16 fpPrivateProblemHandler; - LPARAM lpClassInstallParams; - struct _DEVICE_INFO *lpdiChildList; - DWORD dwFlagsEx; - /*LPDRIVER_INFO*/ LPVOID lpCompatDrvInfoList; - /*LPDRIVER_INFO*/ LPVOID lpClassDrvInfoList; - char szClassGUID[MAX_GUID_STR]; -} DEVICE_INFO16, *LPDEVICE_INFO16, **LPLPDEVICE_INFO16; - - -extern void WINAPI GenFormStrWithoutPlaceHolders16(LPSTR,LPCSTR,HINF16); -extern RETERR16 WINAPI IpOpen16(LPCSTR,HINF16 *); -extern RETERR16 WINAPI IpClose16(HINF16); -extern RETERR16 WINAPI CtlSetLdd16(LPLOGDISKDESC); -extern RETERR16 WINAPI CtlGetLdd16(LPLOGDISKDESC); -extern RETERR16 WINAPI CtlFindLdd16(LPLOGDISKDESC); -extern RETERR16 WINAPI CtlAddLdd16(LPLOGDISKDESC); -extern RETERR16 WINAPI CtlDelLdd16(LOGDISKID16); -extern RETERR16 WINAPI CtlGetLddPath16(LOGDISKID16 ldid, LPSTR szPath); -extern RETERR16 WINAPI GenInstall16(HINF16,LPCSTR,WORD); - -typedef struct tagLDD_LIST { - LPLOGDISKDESC pldd; - struct tagLDD_LIST *next; -} LDD_LIST; - -#define INIT_LDD(ldd, LDID) \ - do { \ - memset(&(ldd), 0, sizeof(LOGDISKDESC_S)); \ - (ldd).cbSize = sizeof(LOGDISKDESC_S); \ - ldd.ldid = LDID; \ - } while(0) - -#endif /* __SETUPX16_H */ diff --git a/reactos/lib/setupapi/setupx_main.c b/reactos/lib/setupapi/setupx_main.c deleted file mode 100644 index ca3ac711792..00000000000 --- a/reactos/lib/setupapi/setupx_main.c +++ /dev/null @@ -1,615 +0,0 @@ -/* - * SETUPX library - * - * Copyright 1998,2000 Andreas Mohr - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * FIXME: Rather non-functional functions for now. - * - * See: - * http://www.geocities.com/SiliconValley/Network/5317/drivers.html - * http://willemer.de/informatik/windows/inf_info.htm (German) - * http://www.microsoft.com/ddk/ddkdocs/win98ddk/devinst_12uw.htm - * DDK: setupx.h - * http://mmatrix.tripod.com/customsystemfolder/infsysntaxfull.html - * http://www.rdrop.com/~cary/html/inf_faq.html - * http://support.microsoft.com/support/kb/articles/q194/6/40.asp - * - * Stuff tested with: - * - rs405deu.exe (German Acroread 4.05 setup) - * - ie5setup.exe - * - Netmeeting - * - * FIXME: - * - string handling is... weird ;) (buflen etc.) - * - memory leaks ? - * - separate that mess (but probably only when it's done completely) - * - * SETUPX consists of several parts with the following acronyms/prefixes: - * Di device installer (devinst.c ?) - * Gen generic installer (geninst.c ?) - * Ip .INF parsing (infparse.c) - * LDD logical device descriptor (ldd.c ?) - * LDID logical device ID - * SU setup (setup.c ?) - * Tp text processing (textproc.c ?) - * Vcp virtual copy module (vcp.c ?) - * ... - * - * The SETUPX DLL is NOT thread-safe. That's why many installers urge you to - * "close all open applications". - * All in all the design of it seems to be a bit weak. - * Not sure whether my implementation of it is better, though ;-) - */ - -#include -#include -#include -#include -#include "windef.h" -#include "winbase.h" -#include "winreg.h" -#include "winerror.h" -#include "wine/winuser16.h" -#include "wownt32.h" -#include "wingdi.h" -#include "winuser.h" -#include "winnls.h" -#include "setupapi.h" -#include "setupx16.h" -#include "setupapi_private.h" -#include "winerror.h" -#include "wine/debug.h" - -WINE_DEFAULT_DEBUG_CHANNEL(setupapi); - -#define HINSTANCE_32(h16) ((HINSTANCE)(ULONG_PTR)(h16)) - -/*********************************************************************** - * SURegOpenKey (SETUPX.47) - */ -DWORD WINAPI SURegOpenKey( HKEY hkey, LPCSTR lpszSubKey, PHKEY retkey ) -{ - FIXME("(%p,%s,%p), semi-stub.\n",hkey,debugstr_a(lpszSubKey),retkey); - return RegOpenKeyA( hkey, lpszSubKey, retkey ); -} - -/*********************************************************************** - * SURegQueryValueEx (SETUPX.50) - */ -DWORD WINAPI SURegQueryValueEx( HKEY hkey, LPSTR lpszValueName, - LPDWORD lpdwReserved, LPDWORD lpdwType, - LPBYTE lpbData, LPDWORD lpcbData ) -{ - FIXME("(%p,%s,%p,%p,%p,%ld), semi-stub.\n",hkey,debugstr_a(lpszValueName), - lpdwReserved,lpdwType,lpbData,lpcbData?*lpcbData:0); - return RegQueryValueExA( hkey, lpszValueName, lpdwReserved, lpdwType, - lpbData, lpcbData ); -} - - -/*********************************************************************** - * InstallHinfSection (SETUPX.527) - * - * hwnd = parent window - * hinst = instance of SETUPX.DLL - * lpszCmdLine = e.g. "DefaultInstall 132 C:\MYINSTALL\MYDEV.INF" - * Here "DefaultInstall" is the .inf file section to be installed (optional). - * The 132 value is made of the HOW_xxx flags and sometimes 128 (-> setupx16.h). - * - * nCmdShow = nCmdShow of CreateProcess - */ -RETERR16 WINAPI InstallHinfSection16( HWND16 hwnd, HINSTANCE16 hinst, LPCSTR lpszCmdLine, INT16 nCmdShow) -{ - InstallHinfSectionA( HWND_32(hwnd), HINSTANCE_32(hinst), lpszCmdLine, nCmdShow ); - return OK; -} - -typedef struct -{ - LPCSTR RegValName; - LPCSTR StdString; /* fallback string; sub dir of windows directory */ -} LDID_DATA; - -static const LDID_DATA LDID_Data[34] = -{ - { /* 0 (LDID_NULL) -- not defined */ - NULL, - NULL - }, - { /* 1 (LDID_SRCPATH) = source of installation. hmm, what to do here ? */ - "SourcePath", /* hmm, does SETUPX have to care about updating it ?? */ - NULL - }, - { /* 2 (LDID_SETUPTEMP) = setup temp dir */ - "SetupTempDir", - NULL - }, - { /* 3 (LDID_UNINSTALL) = uninstall backup dir */ - "UninstallDir", - NULL - }, - { /* 4 (LDID_BACKUP) = backup dir */ - "BackupDir", - NULL - }, - { /* 5 (LDID_SETUPSCRATCH) = setup scratch dir */ - "SetupScratchDir", - NULL - }, - { /* 6 -- not defined */ - NULL, - NULL - }, - { /* 7 -- not defined */ - NULL, - NULL - }, - { /* 8 -- not defined */ - NULL, - NULL - }, - { /* 9 -- not defined */ - NULL, - NULL - }, - { /* 10 (LDID_WIN) = windows dir */ - "WinDir", - "" - }, - { /* 11 (LDID_SYS) = system dir */ - "SysDir", - NULL /* call GetSystemDirectory() instead */ - }, - { /* 12 (LDID_IOS) = IOSubSys dir */ - NULL, /* FIXME: registry string ? */ - "SYSTEM\\IOSUBSYS" - }, - { /* 13 (LDID_CMD) = COMMAND dir */ - NULL, /* FIXME: registry string ? */ - "COMMAND" - }, - { /* 14 (LDID_CPL) = control panel dir */ - NULL, - "" - }, - { /* 15 (LDID_PRINT) = windows printer dir */ - NULL, - "SYSTEM" /* correct ?? */ - }, - { /* 16 (LDID_MAIL) = destination mail dir */ - NULL, - "" - }, - { /* 17 (LDID_INF) = INF dir */ - "SetupScratchDir", /* correct ? */ - "INF" - }, - { /* 18 (LDID_HELP) = HELP dir */ - NULL, /* ??? */ - "HELP" - }, - { /* 19 (LDID_WINADMIN) = Admin dir */ - "WinAdminDir", - "" - }, - { /* 20 (LDID_FONTS) = Fonts dir */ - NULL, /* ??? */ - "FONTS" - }, - { /* 21 (LDID_VIEWERS) = Viewers */ - NULL, /* ??? */ - "SYSTEM\\VIEWERS" - }, - { /* 22 (LDID_VMM32) = VMM32 dir */ - NULL, /* ??? */ - "SYSTEM\\VMM32" - }, - { /* 23 (LDID_COLOR) = ICM dir */ - "ICMPath", - "SYSTEM\\COLOR" - }, - { /* 24 (LDID_APPS) = root of boot drive ? */ - "AppsDir", - "C:\\" - }, - { /* 25 (LDID_SHARED) = shared dir */ - "SharedDir", - "" - }, - { /* 26 (LDID_WINBOOT) = Windows boot dir */ - "WinBootDir", - "" - }, - { /* 27 (LDID_MACHINE) = machine specific files */ - "MachineDir", - NULL - }, - { /* 28 (LDID_HOST_WINBOOT) = Host Windows boot dir */ - "HostWinBootDir", - NULL - }, - { /* 29 -- not defined */ - NULL, - NULL - }, - { /* 30 (LDID_BOOT) = Root of boot drive */ - "BootDir", - NULL - }, - { /* 31 (LDID_BOOT_HOST) = Root of boot drive host */ - "BootHost", - NULL - }, - { /* 32 (LDID_OLD_WINBOOT) = subdir of root */ - "OldWinBootDir", - NULL - }, - { /* 33 (LDID_OLD_WIN) = old win dir */ - "OldWinDir", - NULL - } - /* the rest (34-38) isn't too interesting, so I'll forget about it */ -}; - -/* - * LDD == Logical Device Descriptor - * LDID == Logical Device ID - * - * The whole LDD/LDID business might go into a separate file named - * ldd.c. - * At the moment I don't know what the hell these functions are really doing. - * That's why I added reporting stubs. - * The only thing I do know is that I need them for the LDD/LDID infrastructure. - * That's why I implemented them in a way that's suitable for my purpose. - */ -static LDD_LIST *pFirstLDD = NULL; - -static BOOL std_LDDs_done = FALSE; - -void SETUPX_CreateStandardLDDs(void) -{ - HKEY hKey = 0; - WORD n; - DWORD type, len; - LOGDISKDESC_S ldd; - char buffer[MAX_PATH]; - - /* has to be here, otherwise loop */ - std_LDDs_done = TRUE; - - RegOpenKeyA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Setup", &hKey); - - for (n=0; n < sizeof(LDID_Data)/sizeof(LDID_DATA); n++) - { - buffer[0] = '\0'; - - len = MAX_PATH; - if ( (hKey) && (LDID_Data[n].RegValName) - && (RegQueryValueExA(hKey, LDID_Data[n].RegValName, - NULL, &type, buffer, &len) == ERROR_SUCCESS) - && (type == REG_SZ) ) - { - TRACE("found value '%s' for LDID %d\n", buffer, n); - } - else - switch(n) - { - case LDID_SRCPATH: - FIXME("LDID_SRCPATH: what exactly do we have to do here ?\n"); - strcpy(buffer, "X:\\FIXME"); - break; - case LDID_SYS: - GetSystemDirectoryA(buffer, MAX_PATH); - break; - case LDID_APPS: - case LDID_MACHINE: - case LDID_HOST_WINBOOT: - case LDID_BOOT: - case LDID_BOOT_HOST: - strcpy(buffer, "C:\\"); - break; - default: - if (LDID_Data[n].StdString) - { - DWORD len = GetWindowsDirectoryA(buffer, MAX_PATH); - LPSTR p; - p = buffer + len; - *p++ = '\\'; - strcpy(p, LDID_Data[n].StdString); - } - break; - } - if (buffer[0]) - { - INIT_LDD(ldd, n); - ldd.pszPath = buffer; - TRACE("LDID %d -> '%s'\n", ldd.ldid, ldd.pszPath); - CtlSetLdd16(&ldd); - } - } - if (hKey) RegCloseKey(hKey); -} - -/*********************************************************************** - * CtlDelLdd (SETUPX.37) - * - * RETURN - * ERR_VCP_LDDINVALID if ldid < LDID_ASSIGN_START. - */ -RETERR16 SETUPX_DelLdd(LOGDISKID16 ldid) -{ - LDD_LIST *pCurr, *pPrev = NULL; - - TRACE("(%d)\n", ldid); - - if (!std_LDDs_done) - SETUPX_CreateStandardLDDs(); - - if (ldid < LDID_ASSIGN_START) - return ERR_VCP_LDDINVALID; - - pCurr = pFirstLDD; - /* search until we find the appropriate LDD or hit the end */ - while ((pCurr != NULL) && (ldid > pCurr->pldd->ldid)) - { - pPrev = pCurr; - pCurr = pCurr->next; - } - if ( (pCurr == NULL) /* hit end of list */ - || (ldid != pCurr->pldd->ldid) ) - return ERR_VCP_LDDFIND; /* correct ? */ - - /* ok, found our victim: eliminate it */ - - if (pPrev) - pPrev->next = pCurr->next; - - if (pCurr == pFirstLDD) - pFirstLDD = NULL; - HeapFree(GetProcessHeap(), 0, pCurr); - - return OK; -} - -/*********************************************************************** - * CtlDelLdd (SETUPX.37) - */ -RETERR16 WINAPI CtlDelLdd16(LOGDISKID16 ldid) -{ - FIXME("(%d); - please report this!\n", ldid); - return SETUPX_DelLdd(ldid); -} - -/*********************************************************************** - * CtlFindLdd (SETUPX.35) - * - * doesn't check pldd ptr validity: crash (W98SE) - * - * RETURN - * ERR_VCP_LDDINVALID if pldd->cbSize != structsize - * 1 in all other cases ?? - * - */ -RETERR16 WINAPI CtlFindLdd16(LPLOGDISKDESC pldd) -{ - LDD_LIST *pCurr, *pPrev = NULL; - - TRACE("(%p)\n", pldd); - - if (!std_LDDs_done) - SETUPX_CreateStandardLDDs(); - - if (pldd->cbSize != sizeof(LOGDISKDESC_S)) - return ERR_VCP_LDDINVALID; - - pCurr = pFirstLDD; - /* search until we find the appropriate LDD or hit the end */ - while ((pCurr != NULL) && (pldd->ldid > pCurr->pldd->ldid)) - { - pPrev = pCurr; - pCurr = pCurr->next; - } - if ( (pCurr == NULL) /* hit end of list */ - || (pldd->ldid != pCurr->pldd->ldid) ) - return ERR_VCP_LDDFIND; /* correct ? */ - - memcpy(pldd, pCurr->pldd, pldd->cbSize); - /* hmm, we probably ought to strcpy() the string ptrs here */ - - return 1; /* what is this ?? */ -} - -/*********************************************************************** - * CtlSetLdd (SETUPX.33) - * - * Set an LDD entry. - * - * RETURN - * ERR_VCP_LDDINVALID if pldd.cbSize != sizeof(LOGDISKDESC_S) - * - */ -RETERR16 WINAPI CtlSetLdd16(LPLOGDISKDESC pldd) -{ - LDD_LIST *pCurr, *pPrev = NULL; - LPLOGDISKDESC pCurrLDD; - HANDLE heap; - BOOL is_new = FALSE; - - TRACE("(%p)\n", pldd); - - if (!std_LDDs_done) - SETUPX_CreateStandardLDDs(); - - if (pldd->cbSize != sizeof(LOGDISKDESC_S)) - return ERR_VCP_LDDINVALID; - - heap = GetProcessHeap(); - pCurr = pFirstLDD; - /* search until we find the appropriate LDD or hit the end */ - while ((pCurr != NULL) && (pldd->ldid > pCurr->pldd->ldid)) - { - pPrev = pCurr; - pCurr = pCurr->next; - } - if (!pCurr || pldd->ldid != pCurr->pldd->ldid) - { - is_new = TRUE; - pCurr = HeapAlloc(heap, 0, sizeof(LDD_LIST)); - pCurr->pldd = HeapAlloc(heap, 0, sizeof(LOGDISKDESC_S)); - pCurr->next = NULL; - pCurrLDD = pCurr->pldd; - } - else - { - pCurrLDD = pCurr->pldd; - if (pCurrLDD->pszPath) HeapFree(heap, 0, pCurrLDD->pszPath); - if (pCurrLDD->pszVolLabel) HeapFree(heap, 0, pCurrLDD->pszVolLabel); - if (pCurrLDD->pszDiskName) HeapFree(heap, 0, pCurrLDD->pszDiskName); - } - - memcpy(pCurrLDD, pldd, sizeof(LOGDISKDESC_S)); - - if (pldd->pszPath) - { - pCurrLDD->pszPath = HeapAlloc( heap, 0, strlen(pldd->pszPath)+1 ); - strcpy( pCurrLDD->pszPath, pldd->pszPath ); - } - if (pldd->pszVolLabel) - { - pCurrLDD->pszVolLabel = HeapAlloc( heap, 0, strlen(pldd->pszVolLabel)+1 ); - strcpy( pCurrLDD->pszVolLabel, pldd->pszVolLabel ); - } - if (pldd->pszDiskName) - { - pCurrLDD->pszDiskName = HeapAlloc( heap, 0, strlen(pldd->pszDiskName)+1 ); - strcpy( pCurrLDD->pszDiskName, pldd->pszDiskName ); - } - - if (is_new) /* link into list */ - { - if (pPrev) - { - pCurr->next = pPrev->next; - pPrev->next = pCurr; - } - if (!pFirstLDD) - pFirstLDD = pCurr; - } - - return OK; -} - - -/*********************************************************************** - * CtlAddLdd (SETUPX.36) - * - * doesn't check pldd ptr validity: crash (W98SE) - * - */ -static LOGDISKID16 ldid_to_add = LDID_ASSIGN_START; -RETERR16 WINAPI CtlAddLdd16(LPLOGDISKDESC pldd) -{ - pldd->ldid = ldid_to_add++; - return CtlSetLdd16(pldd); -} - -/*********************************************************************** - * CtlGetLdd (SETUPX.34) - * - * doesn't check pldd ptr validity: crash (W98SE) - * What the !@#$%&*( is the difference between CtlFindLdd() and CtlGetLdd() ?? - * - * RETURN - * ERR_VCP_LDDINVALID if pldd->cbSize != structsize - * - */ -static RETERR16 SETUPX_GetLdd(LPLOGDISKDESC pldd) -{ - LDD_LIST *pCurr, *pPrev = NULL; - - if (!std_LDDs_done) - SETUPX_CreateStandardLDDs(); - - if (pldd->cbSize != sizeof(LOGDISKDESC_S)) - return ERR_VCP_LDDINVALID; - - pCurr = pFirstLDD; - /* search until we find the appropriate LDD or hit the end */ - while ((pCurr != NULL) && (pldd->ldid > pCurr->pldd->ldid)) - { - pPrev = pCurr; - pCurr = pCurr->next; - } - if (pCurr == NULL) /* hit end of list */ - return ERR_VCP_LDDFIND; /* correct ? */ - - memcpy(pldd, pCurr->pldd, pldd->cbSize); - /* hmm, we probably ought to strcpy() the string ptrs here */ - - return OK; -} - -/**********************************************************************/ - -RETERR16 WINAPI CtlGetLdd16(LPLOGDISKDESC pldd) -{ - FIXME("(%p); - please report this!\n", pldd); - return SETUPX_GetLdd(pldd); -} - -/*********************************************************************** - * CtlGetLddPath (SETUPX.38) - * - * Gets the path of an LDD. - * No crash if szPath == NULL. - * szPath has to be at least MAX_PATH_LEN bytes long. - * RETURN - * ERR_VCP_LDDUNINIT if LDD for LDID not found. - */ -RETERR16 WINAPI CtlGetLddPath16(LOGDISKID16 ldid, LPSTR szPath) -{ - TRACE("(%d, %p);\n", ldid, szPath); - - if (szPath) - { - LOGDISKDESC_S ldd; - INIT_LDD(ldd, ldid); - if (CtlFindLdd16(&ldd) == ERR_VCP_LDDFIND) - return ERR_VCP_LDDUNINIT; - SETUPX_GetLdd(&ldd); - strcpy(szPath, ldd.pszPath); - TRACE("ret '%s' for LDID %d\n", szPath, ldid); - } - return OK; -} - -/*********************************************************************** - * CtlSetLddPath (SETUPX.508) - * - * Sets the path of an LDD. - * Creates LDD for LDID if not existing yet. - */ -RETERR16 WINAPI CtlSetLddPath16(LOGDISKID16 ldid, LPSTR szPath) -{ - LOGDISKDESC_S ldd; - TRACE("(%d, '%s');\n", ldid, szPath); - - SetupSetDirectoryIdA( 0, ldid, szPath ); - INIT_LDD(ldd, ldid); - ldd.pszPath = szPath; - return CtlSetLdd16(&ldd); -} diff --git a/reactos/lib/setupapi/stubs.c b/reactos/lib/setupapi/stubs.c deleted file mode 100644 index 2007ef0d9f8..00000000000 --- a/reactos/lib/setupapi/stubs.c +++ /dev/null @@ -1,164 +0,0 @@ -/* - * SetupAPI stubs - * - * Copyright 2000 James Hatheway - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include - -#include "wine/debug.h" -#include "windef.h" -#include "winbase.h" -#include "wingdi.h" -#include "winuser.h" -#include "winnls.h" -#include "winreg.h" -#include "setupapi.h" - -WINE_DEFAULT_DEBUG_CHANNEL(setupapi); - -/*********************************************************************** - * TPWriteProfileString (SETUPX.62) - */ -BOOL WINAPI TPWriteProfileString16( LPCSTR section, LPCSTR entry, LPCSTR string ) -{ - FIXME( "%s %s %s: stub\n", debugstr_a(section), debugstr_a(entry), debugstr_a(string) ); - return TRUE; -} - - -/*********************************************************************** - * suErrorToIds (SETUPX.61) - */ -DWORD WINAPI suErrorToIds16( WORD w1, WORD w2 ) -{ - FIXME( "%x %x: stub\n", w1, w2 ); - return 0; -} - -/*********************************************************************** - * SetupDiGetDeviceInfoListDetailA (SETUPAPI.@) - */ -BOOL WINAPI SetupDiGetDeviceInfoListDetailA(HDEVINFO devinfo, PSP_DEVINFO_LIST_DETAIL_DATA_A devinfo_data ) -{ - FIXME("\n"); - return FALSE; -} - -/*********************************************************************** - * SetupDiGetDeviceInfoListDetailW (SETUPAPI.@) - */ -BOOL WINAPI SetupDiGetDeviceInfoListDetailW(HDEVINFO devinfo, PSP_DEVINFO_LIST_DETAIL_DATA_W devinfo_data ) -{ - FIXME("\n"); - return FALSE; -} - - -/*********************************************************************** - * SetupDiGetClassDevsExA (SETUPAPI.@) - * - * NO WINAPI in description given - */ -HDEVINFO WINAPI SetupDiGetClassDevsExA(const GUID *class, PCSTR filter, HWND parent, DWORD flags, HDEVINFO deviceset, PCSTR machine, PVOID reserved) -{ - FIXME("filter %s machine %s\n",debugstr_a(filter),debugstr_a(machine)); - return FALSE; -} - -/*********************************************************************** - * SetupDiGetClassDevsExW (SETUPAPI.@) - * - * NO WINAPI in description given - */ -HDEVINFO WINAPI SetupDiGetClassDevsExW(const GUID *class, PCWSTR filter, HWND parent, DWORD flags, HDEVINFO deviceset, PCWSTR machine, PVOID reserved) -{ - FIXME("\n"); - return FALSE; -} - -/*********************************************************************** - * CM_Connect_MachineW (SETUPAPI.@) - */ -DWORD WINAPI CM_Connect_MachineW(LPCWSTR name, void * machine) -{ -#define CR_SUCCESS 0x00000000 -#define CR_ACCESS_DENIED 0x00000033 - FIXME("\n"); - return CR_ACCESS_DENIED; -} - -/*********************************************************************** - * CM_Disconnect_Machine (SETUPAPI.@) - */ -DWORD WINAPI CM_Disconnect_Machine(DWORD handle) -{ - FIXME("\n"); - return CR_SUCCESS; - -} - -/*********************************************************************** - * SetupCopyOEMInfA (SETUPAPI.@) - */ -BOOL WINAPI SetupCopyOEMInfA(PCSTR sourceinffile, PCSTR sourcemedialoc, - DWORD mediatype, DWORD copystyle, PSTR destinfname, - DWORD destnamesize, PDWORD required, - PSTR *destinfnamecomponent) -{ - FIXME("stub: source %s location %s ...\n",sourceinffile, sourcemedialoc); - return FALSE; -} - -/*********************************************************************** - * SetupGetInfInformationA (SETUPAPI.@) - */ -BOOL WINAPI SetupGetInfInformationA( LPCVOID InfSpec, DWORD SearchControl, - PSP_INF_INFORMATION ReturnBuffer, - DWORD ReturnBufferSize, PDWORD RequiredSize) -{ - FIXME("(%p, %ld, %p, %ld, %p) Stub!\n", - InfSpec, SearchControl, ReturnBuffer, ReturnBufferSize, RequiredSize ); - return TRUE; -} - -/*********************************************************************** - * SetupInitializeFileLogW(SETUPAPI.@) - */ -HANDLE WINAPI SetupInitializeFileLogW(LPWSTR LogFileName, DWORD Flags) -{ - FIXME("Stub %s, 0x%lx\n",debugstr_w(LogFileName),Flags); - return INVALID_HANDLE_VALUE; -} - -/*********************************************************************** - * SetupInitializeFileLogA(SETUPAPI.@) - */ -HANDLE WINAPI SetupInitializeFileLogA(LPSTR LogFileName, DWORD Flags) -{ - FIXME("Stub %s, 0x%lx\n",debugstr_a(LogFileName),Flags); - return INVALID_HANDLE_VALUE; -} - -/*********************************************************************** - * SetupTerminateFileLog(SETUPAPI.@) - */ -BOOL WINAPI SetupTerminateFileLog(HANDLE FileLogHandle) -{ - FIXME ("Stub %p\n",FileLogHandle); - return TRUE; -} diff --git a/reactos/lib/setupapi/virtcopy.c b/reactos/lib/setupapi/virtcopy.c deleted file mode 100644 index 47c79dcf54a..00000000000 --- a/reactos/lib/setupapi/virtcopy.c +++ /dev/null @@ -1,789 +0,0 @@ -/* - * SetupAPI virtual copy operations - * - * Copyright 2001 Andreas Mohr - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * FIXME: we now rely on builtin setupapi.dll for dialog resources. - * This is bad ! We ought to have 16bit resource handling working. - */ - -#include -#include -#include "windef.h" -#include "winbase.h" -#include "winuser.h" -#include "winreg.h" -#include "wownt32.h" -#include "wingdi.h" -#include "winnls.h" -#include "setupapi.h" -#include "setupx16.h" -#include "setupapi_private.h" -#include "wine/debug.h" - -WINE_DEFAULT_DEBUG_CHANNEL(setupapi); - -static FARPROC16 VCP_Proc = NULL; -static LPARAM VCP_MsgRef = 0; - -static BOOL VCP_opened = FALSE; - -static VCPSTATUS vcp_status; - -static HINSTANCE SETUPAPI_hInstance; - -static WORD VCP_Callback( LPVOID obj, UINT16 msg, WPARAM16 wParam, LPARAM lParam, LPARAM lParamRef ) -{ - WORD args[8]; - DWORD ret = OK; - if (VCP_Proc) - { - args[7] = HIWORD(obj); - args[6] = LOWORD(obj); - args[5] = msg; - args[4] = wParam; - args[3] = HIWORD(lParam); - args[2] = LOWORD(lParam); - args[1] = HIWORD(lParamRef); - args[0] = LOWORD(lParamRef); - WOWCallback16Ex( (DWORD)VCP_Proc, WCB16_PASCAL, sizeof(args), args, &ret ); - } - return (WORD)ret; -} - -/****************************** VHSTR management ******************************/ - -/* - * This is a totally braindead implementation for now; - * I don't care about speed at all ! Size and implementation time - * is much more important IMHO. I could have created some sophisticated - * tree structure, but... what the hell ! :-) - */ -typedef struct { - DWORD refcount; - LPCSTR pStr; -} VHSTR_STRUCT; - -static VHSTR_STRUCT **vhstrlist = NULL; -static VHSTR vhstr_alloc = 0; - -#define VALID_VHSTR(x) ((x < vhstr_alloc) && (vhstrlist[x]) && (vhstrlist[x]->refcount)) - -/*********************************************************************** - * vsmStringAdd (SETUPX.207) - */ -VHSTR WINAPI vsmStringAdd16(LPCSTR lpszName) -{ - VHSTR n; - VHSTR index = 0xffff; - HANDLE heap; - - TRACE("add string '%s'\n", lpszName); - /* search whether string already inserted */ - TRACE("searching for existing string...\n"); - for (n = 0; n < vhstr_alloc; n++) - { - if ((vhstrlist[n]) && (vhstrlist[n]->refcount)) - { - TRACE("checking item: %d\n", n); - if (!strcmp(vhstrlist[n]->pStr, lpszName)) - { - TRACE("found\n"); - vhstrlist[n]->refcount++; - return n; - } - } - } - - /* hmm, not found yet, let's insert it */ - TRACE("inserting item\n"); - for (n = 0; n < vhstr_alloc; n++) - { - if ((!(vhstrlist[n])) || (!(vhstrlist[n]->refcount))) - { - index = n; - break; - } - } - heap = GetProcessHeap(); - if (n == vhstr_alloc) /* hmm, no free index found yet */ - { - index = vhstr_alloc; - vhstr_alloc += 20; - - if (vhstrlist) - vhstrlist = HeapReAlloc(heap, HEAP_ZERO_MEMORY, vhstrlist, - sizeof(VHSTR_STRUCT *) * vhstr_alloc); - else - vhstrlist = HeapAlloc(heap, HEAP_ZERO_MEMORY, - sizeof(VHSTR_STRUCT *) * vhstr_alloc); - } - if (index == 0xffff) - return 0xffff; /* failure */ - if (!vhstrlist[index]) - vhstrlist[index] = HeapAlloc(heap, HEAP_ZERO_MEMORY, sizeof(VHSTR_STRUCT)); - vhstrlist[index]->refcount = 1; - vhstrlist[index]->pStr = HeapAlloc(heap, 0, strlen(lpszName)+1); - strcpy((LPSTR)vhstrlist[index]->pStr, lpszName); - return index; -} - -/*********************************************************************** - * vsmStringDelete (SETUPX.206) - */ -INT16 WINAPI vsmStringDelete16(VHSTR vhstr) -{ - if (VALID_VHSTR(vhstr)) - { - vhstrlist[vhstr]->refcount--; - if (!vhstrlist[vhstr]->refcount) - { - HeapFree(GetProcessHeap(), 0, (LPSTR)vhstrlist[vhstr]->pStr); - vhstrlist[vhstr]->pStr = NULL; - } - return VCPN_OK; - } - - /* string not found */ - return VCPN_FAIL; -} - -/* - * vsmStringFind() - not exported from a standard SETUPX.DLL, it seems - */ -VHSTR WINAPI vsmStringFind16(LPCSTR lpszName) -{ - WORD n; - for (n = 0; n < vhstr_alloc; n++) - if ((vhstrlist[n]) && (vhstrlist[n]->refcount) && (!strcmp(vhstrlist[n]->pStr, lpszName))) - return n; - return 0xffff; -} - -/*********************************************************************** - * vsmGetStringName (SETUPX.205) - * - * Pretty correct, I guess - */ -INT16 WINAPI vsmGetStringName16(VHSTR vhstr, LPSTR lpszBuffer, int cbBuffer) -{ - if (VALID_VHSTR(vhstr)) - { - int len = strlen(vhstrlist[vhstr]->pStr)+1; - if (cbBuffer >= len) - { - if (lpszBuffer) - strcpy(lpszBuffer, vhstrlist[vhstr]->pStr); - return len; - } - } - return VCPN_FAIL; -} - -/*********************************************************************** - * vsmStringCompare (not exported from a standard SETUPX.DLL, it seems) - */ -INT16 WINAPI vsmStringCompare16(VHSTR vhstrA, VHSTR vhstrB) -{ - if ((!VALID_VHSTR(vhstrA)) || (!VALID_VHSTR(vhstrB))) - return VCPN_FAIL; /* correct ? */ - return strcmp(vhstrlist[vhstrA]->pStr, vhstrlist[vhstrB]->pStr); -} - -/*********************************************************************** - * vsmGetStringRawName (SETUPX.208) - */ -LPCSTR WINAPI vsmGetStringRawName16(VHSTR vhstr) -{ - return (VALID_VHSTR(vhstr)) ? vhstrlist[vhstr]->pStr : NULL; -} - - -/***************************** VIRTNODE management ****************************/ -static LPVIRTNODE *pvnlist = NULL; -static DWORD vn_num = 0; -static DWORD vn_last = 0; - -RETERR16 VCP_VirtnodeCreate(LPVCPFILESPEC vfsSrc, LPVCPFILESPEC vfsDst, WORD fl, LPARAM lParam, LPEXPANDVTBL lpExpandVtbl) -{ - HANDLE heap; - LPVIRTNODE lpvn; - RETERR16 cbres; - - while (vn_last < vn_num) - { - if (pvnlist[vn_last] == NULL) - break; - vn_last++; - } - heap = GetProcessHeap(); - if (vn_last == vn_num) - { - vn_num += 20; - if (pvnlist) - pvnlist = HeapReAlloc(heap, HEAP_ZERO_MEMORY, pvnlist, - sizeof(LPVIRTNODE *) * vn_num); - else - pvnlist = HeapAlloc(heap, HEAP_ZERO_MEMORY, - sizeof(LPVIRTNODE *) * vn_num); - } - pvnlist[vn_last] = HeapAlloc(heap, HEAP_ZERO_MEMORY, sizeof(VIRTNODE)); - lpvn = pvnlist[vn_last]; - vn_last++; - - lpvn->cbSize = sizeof(VIRTNODE); - - if (vfsSrc) - memcpy(&lpvn->vfsSrc, vfsSrc, sizeof(VCPFILESPEC)); - - if (vfsDst) - memcpy(&lpvn->vfsDst, vfsDst, sizeof(VCPFILESPEC)); - - lpvn->fl = fl; - lpvn->lParam = lParam; - lpvn->lpExpandVtbl = lpExpandVtbl; - - lpvn->vhstrDstFinalName = 0xffff; /* FIXME: what is this ? */ - - cbres = VCP_Callback(lpvn, VCPM_NODECREATE, 0, 0, VCP_MsgRef); - lpvn->fl |= VFNL_CREATED; - cbres = VCP_Callback(lpvn, VCPM_NODEACCEPT, 0, 0, VCP_MsgRef); - - return OK; -} - -BOOL VCP_VirtnodeDelete(LPVIRTNODE lpvnDel) -{ - DWORD n; - RETERR16 cbres; - - for (n = 0; n < vn_last; n++) - { - if (pvnlist[n] == lpvnDel) - { - cbres = VCP_Callback(lpvnDel, VCPM_NODEDESTROY, 0, 0, VCP_MsgRef); - HeapFree(GetProcessHeap(), 0, lpvnDel); - pvnlist[n] = NULL; - return TRUE; - } - } - return FALSE; -} - -/*********************************************************************** - * VcpOpen (SETUPX.200) - * - * Sets up a virtual copy operation. - * This means that functions such as GenInstall() - * create a VIRTNODE struct for every file to be touched in a .INF file - * instead of actually touching the file. - * The actual copy/move/rename gets started when VcpClose or - * VcpFlush is called; several different callbacks are made - * (copy, rename, open, close, version conflicts, ...) on every file copied. - */ -RETERR16 WINAPI VcpOpen16(VIFPROC vifproc, LPARAM lparamMsgRef) -{ - TRACE("(%p, %08lx)\n", vifproc, lparamMsgRef); - if (VCP_opened) - return ERR_VCP_BUSY; - - VCP_Proc = (FARPROC16)vifproc; - VCP_MsgRef = lparamMsgRef; - - /* load SETUPAPI needed for dialog resources etc. */ - SETUPAPI_hInstance = LoadLibraryA("setupapi.dll"); - if (!SETUPAPI_hInstance) - { - ERR("Could not load sibling setupapi.dll\n"); - return ERR_VCP_NOMEM; - } - VCP_opened = TRUE; - return OK; -} - -/*********************************************************************** - * VcpQueueCopy [SETUPX.13] - * - * lpExpandVtbl seems to be deprecated. - * fl are the CNFL_xxx and VNFL_xxx flags. - * lParam are the VNLP_xxx flags. - */ -RETERR16 WINAPI VcpQueueCopy16( - LPCSTR lpszSrcFileName, LPCSTR lpszDstFileName, - LPCSTR lpszSrcDir, LPCSTR lpszDstDir, - LOGDISKID16 ldidSrc, LOGDISKID16 ldidDst, - LPEXPANDVTBL lpExpandVtbl, - WORD fl, LPARAM lParam -) -{ - VCPFILESPEC vfsSrc, vfsDst; - - if (!VCP_opened) - return ERR_VCP_NOTOPEN; - - TRACE("srcdir: %s, srcfile: %s, dstdir: %s, dstfile: %s\n", - lpszSrcDir, lpszSrcFileName, lpszDstDir, lpszDstFileName); - - TRACE("ldidSrc == %d, ldidDst == %d\n", ldidSrc, ldidDst); - - vfsSrc.ldid = ldidSrc; - vfsSrc.vhstrDir = vsmStringAdd16(lpszSrcDir); - vfsSrc.vhstrFileName = vsmStringAdd16(lpszSrcFileName); - - vfsDst.ldid = ldidDst; - vfsDst.vhstrDir = vsmStringAdd16(lpszDstDir); - vfsDst.vhstrFileName = vsmStringAdd16(lpszDstFileName); - - return VCP_VirtnodeCreate(&vfsSrc, &vfsDst, fl, lParam, - lpExpandVtbl); -} - -/*********************************************************************** - * VcpQueueDelete [SETUPX.17] - * - * Is lParamRef the same as lParam in VcpQueueCopy ? - * Damn docu !! Err... which docu ? - */ -RETERR16 WINAPI VcpQueueDelete16( - LPCSTR lpszDstFileName, - LPCSTR lpszDstDir, - LOGDISKID16 ldidDst, - LPARAM lParamRef -) -{ - VCPFILESPEC vfsDst; - - if (!VCP_opened) - return ERR_VCP_NOTOPEN; - - vfsDst.ldid = ldidDst; - vfsDst.vhstrDir = vsmStringAdd16(lpszDstDir); - vfsDst.vhstrFileName = vsmStringAdd16(lpszDstFileName); - - return VCP_VirtnodeCreate(NULL, &vfsDst, VNFL_DELETE, lParamRef, 0); -} - -/*********************************************************************** - * VcpQueueRename [SETUPX.204] - * - */ -RETERR16 WINAPI VcpQueueRename16( - LPCSTR lpszSrcFileName, LPCSTR lpszDstFileName, - LPCSTR lpszSrcDir, LPCSTR lpszDstDir, - LOGDISKID16 ldidSrc, LOGDISKID16 ldidDst, - LPARAM lParam -) -{ - VCPFILESPEC vfsSrc, vfsDst; - - if (!VCP_opened) - return ERR_VCP_NOTOPEN; - - vfsSrc.ldid = ldidSrc; - vfsSrc.vhstrDir = vsmStringAdd16(lpszSrcDir); - vfsSrc.vhstrFileName = vsmStringAdd16(lpszSrcFileName); - - vfsDst.ldid = ldidDst; - vfsDst.vhstrDir = vsmStringAdd16(lpszDstDir); - vfsDst.vhstrFileName = vsmStringAdd16(lpszDstFileName); - - return VCP_VirtnodeCreate(&vfsSrc, &vfsDst, VNFL_RENAME, lParam, - 0); -} - -/*********************************************************************** - * VcpEnumFiles (SETUPX.@) - */ -INT16 WINAPI VcpEnumFiles(VCPENUMPROC vep, LPARAM lParamRef) -{ - WORD n; - - for (n = 0; n < vn_last; n++) - vep(pvnlist[n], lParamRef); - - return 0; /* FIXME: return value ? */ -} - -/*********************************************************************** - * VcpExplain (SETUPX.411) - */ -LPCSTR WINAPI VcpExplain16(LPVIRTNODE lpVn, DWORD dwWhat) -{ - static char buffer[MAX_PATH]; /* FIXME: is this how it's done ? */ - buffer[0] = '\0'; - switch (dwWhat) - { - case VCPEX_SRC_FULL: - case VCPEX_DST_FULL: - { - LPVCPFILESPEC lpvfs = - (dwWhat == VCPEX_SRC_FULL) ? &lpVn->vfsSrc : &lpVn->vfsDst; - - /* if we have an ldid, use it, otherwise use the string */ - /* from the vhstrlist array */ - if (lpvfs->ldid != 0xffff) - CtlGetLddPath16(lpvfs->ldid, buffer); - else - strcat(buffer, vsmGetStringRawName16(lpvfs->vhstrDir)); - - strcat(buffer, "\\"); - strcat(buffer, vsmGetStringRawName16(lpvfs->vhstrFileName)); - } - break; - default: - FIXME("%ld unimplemented !\n", dwWhat); - strcpy(buffer, "Unknown error"); - break; - } - return buffer; -} - -RETERR16 VCP_CheckPaths(void) -{ - DWORD n; - LPVIRTNODE lpvn; - RETERR16 cbres; - - cbres = VCP_Callback(&vcp_status, VCPM_VSTATPATHCHECKSTART, 0, 0, VCP_MsgRef); - for (n = 0; n < vn_num; n++) - { - lpvn = pvnlist[n]; - if (!lpvn) continue; - /* FIXME: check paths of all VIRTNODEs here ! */ - cbres = VCP_Callback(&lpvn->vfsDst, VCPM_CHECKPATH, 0, (DWORD)lpvn, VCP_MsgRef); - } - cbres = VCP_Callback(&vcp_status, VCPM_VSTATPATHCHECKEND, 0, 0, VCP_MsgRef); - return OK; -} - -RETERR16 VCP_CopyFiles(void) -{ - char fn_src[MAX_PATH], fn_dst[MAX_PATH]; - RETERR16 res = OK, cbres; - DWORD n; - LPVIRTNODE lpvn; - - cbres = VCP_Callback(&vcp_status, VCPM_VSTATCOPYSTART, 0, 0, VCP_MsgRef); - for (n = 0; n < vn_num; n++) - { - lpvn = pvnlist[n]; - if ((!lpvn) || ((lpvn->fl & VNFL_NODE_TYPE) != VNFL_COPY)) continue; - /* FIXME: need to send VCPM_VSTATNEWDISK notification sometimes */ - strcpy(fn_src, VcpExplain16(lpvn, VCPEX_SRC_FULL)); - strcpy(fn_dst, VcpExplain16(lpvn, VCPEX_DST_FULL)); - /* FIXME: what is this VCPM_VSTATWRITE here for ? - * I guess it's to signal successful destination file creation */ - cbres = VCP_Callback(&vcp_status, VCPM_VSTATWRITE, 0, 0, VCP_MsgRef); - - /* FIXME: need to do the file copy in small chunks for notifications */ - TRACE("copying '%s' to '%s'\n", fn_src, fn_dst); - /* perform the file copy */ - if (!(CopyFileA(fn_src, fn_dst, - (lpvn->fl & VNLP_COPYIFEXISTS) ? FALSE : TRUE ))) - { - ERR("error copying, src: %s -> dst: %s\n", fn_src, fn_dst); - res = ERR_VCP_IOFAIL; - } - - vcp_status.prgFileRead.dwSoFar++; - cbres = VCP_Callback(&vcp_status, VCPM_VSTATREAD, 0, 0, VCP_MsgRef); - vcp_status.prgFileWrite.dwSoFar++; - cbres = VCP_Callback(&vcp_status, VCPM_VSTATWRITE, 0, 0, VCP_MsgRef); - } - - cbres = VCP_Callback(&vcp_status, VCPM_VSTATCOPYEND, 0, 0, VCP_MsgRef); - return res; -} - -/*********************************************************************** - * VcpFlush - internal (not exported), but documented - * - * VNFL_NOW is used for VcpFlush. - */ -RETERR16 VcpFlush16(WORD fl, LPCSTR lpszBackupDest) -{ - return OK; -} - -/*********************************************************************** - * VcpClose (SETUPX.201) - * - * Does callbacks (-> vifproc) with VCPM_VSTATCLOSESTART, - * VCPM_VSTATCLOSEEND. - * - * fl gets VCPFL_xxx flags to indicate what to do with the - * VIRTNODEs (files to mess with) created by e.g. GenInstall() - */ -RETERR16 WINAPI VcpClose16(WORD fl, LPCSTR lpszBackupDest) -{ - RETERR16 res = OK; - WORD cbres = VCPN_PROCEED; - - TRACE("(%04x, '%s')\n", fl, lpszBackupDest); - - /* FIXME: needs to sort virtnodes in case VCPFL_INSPECIFIEDORDER - * is not set. This is done by VCP_Callback(VCPM_NODECOMPARE) */ - - TRACE("#1\n"); - memset(&vcp_status, 0, sizeof(VCPSTATUS)); - /* yes, vcp_status.cbSize is 0 ! */ - TRACE("#2\n"); - cbres = VCP_Callback(&vcp_status, VCPM_VSTATCLOSESTART, 0, 0, VCP_MsgRef); - TRACE("#3\n"); - - res = VCP_CheckPaths(); - TRACE("#4\n"); - if (res != OK) - return res; /* is this ok ? */ - VCP_CopyFiles(); - - TRACE("#5\n"); - cbres = VCP_Callback(&vcp_status, VCPM_VSTATCLOSEEND, 0, 0, VCP_MsgRef); - TRACE("#6\n"); - VCP_Proc = NULL; - FreeLibrary(SETUPAPI_hInstance); - VCP_opened = FALSE; - return OK; -} - -RETERR16 VCP_RenameFiles(void) -{ - char fn_src[MAX_PATH], fn_dst[MAX_PATH]; - RETERR16 res = OK, cbres; - DWORD n; - LPVIRTNODE lpvn; - - cbres = VCP_Callback(&vcp_status, VCPM_VSTATRENAMESTART, 0, 0, VCP_MsgRef); - for (n = 0; n < vn_num; n++) - { - lpvn = pvnlist[n]; - if ((!lpvn) || ((lpvn->fl & VNFL_NODE_TYPE) != VNFL_RENAME)) continue; - strcpy(fn_src, VcpExplain16(lpvn, VCPEX_SRC_FULL)); - strcpy(fn_dst, VcpExplain16(lpvn, VCPEX_DST_FULL)); - cbres = VCP_Callback(&lpvn->vfsDst, VCPM_FILEOPENOUT, 0, (LPARAM)lpvn, VCP_MsgRef); - if (!(MoveFileExA(fn_src, fn_dst, MOVEFILE_REPLACE_EXISTING))) - res = ERR_VCP_IOFAIL; - else - VCP_VirtnodeDelete(lpvn); - } - cbres = VCP_Callback(&vcp_status, VCPM_VSTATRENAMEEND, 0, 0, VCP_MsgRef); - return res; -} - -/*********************************************************************** - * vcpDefCallbackProc (SETUPX.202) - */ -RETERR16 WINAPI vcpDefCallbackProc16(LPVOID lpvObj, UINT16 uMsg, WPARAM wParam, - LPARAM lParam, LPARAM lParamRef) -{ - static int count = 0; - if (count < 10) - FIXME("(%p, %04x, %04x, %08lx, %08lx) - what to do here ?\n", - lpvObj, uMsg, wParam, lParam, lParamRef); - count++; - return OK; -} - -/********************* point-and-click stuff from here ***********************/ - -static HWND hDlgCopy = 0; -static HKEY hKeyFiles = 0, hKeyRename = 0, hKeyConflict = 0; -static char BackupDir[12]; - -static INT_PTR CALLBACK VCP_UI_FileCopyDlgProc(HWND hWndDlg, UINT iMsg, WPARAM wParam, LPARAM lParam) -{ - INT_PTR retval = FALSE; - - if (iMsg == WM_INITDIALOG) - { - ShowWindow(hWndDlg, SW_SHOWNORMAL); - UpdateWindow(hWndDlg); - retval = TRUE; - } - return retval; -} - -BOOL VCP_UI_GetDialogTemplate(LPCVOID *template32) -{ - HRSRC hResInfo; - HGLOBAL hDlgTmpl32; - - if (!(hResInfo = FindResourceA(SETUPAPI_hInstance, MAKEINTRESOURCEA(COPYFILEDLGORD), (LPSTR)RT_DIALOG))) - return FALSE; - if (!(hDlgTmpl32 = LoadResource(SETUPAPI_hInstance, hResInfo )) || - !(*template32 = LockResource( hDlgTmpl32 ))) - return FALSE; - return TRUE; -} - -static LRESULT WINAPI -VCP_UI_FileCopyWndProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) -{ - if (uMsg != WM_CREATE) - return DefWindowProcA (hwnd, uMsg, wParam, lParam); - - switch (uMsg) - { - case WM_CREATE: - return 0; - default: - FIXME("%04x: unhandled.\n", uMsg); - } - - return 0; -} - -void VCP_UI_RegisterProgressClass(void) -{ - static BOOL registered = FALSE; - WNDCLASSA wndClass; - - if (registered) - return; - - registered = TRUE; - ZeroMemory (&wndClass, sizeof(WNDCLASSA)); - wndClass.style = CS_GLOBALCLASS | CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW; - wndClass.lpfnWndProc = (WNDPROC)VCP_UI_FileCopyWndProc; - wndClass.cbClsExtra = 0; - wndClass.cbWndExtra = 0; - wndClass.hCursor = LoadCursorA (0, (LPSTR)IDC_ARROW); - wndClass.hbrBackground = NULL; - wndClass.lpszClassName = "setupx_progress"; - - RegisterClassA (&wndClass); -} - -RETERR16 VCP_UI_NodeCompare(LPVIRTNODE vn1, LPVIRTNODE vn2) -{ - LPCSTR file1, file2; - file1 = vsmGetStringRawName16(vn1->vfsSrc.vhstrFileName); - file2 = vsmGetStringRawName16(vn2->vfsSrc.vhstrFileName); - return (RETERR16)strcmp(file1, file2); -} - -RETERR16 VCP_UI_CopyStart(void) -{ - LPCVOID template32; - char buf[256]; /* plenty */ - BOOL dirty; - DWORD len; - - /* FIXME: should be registered at DLL startup instead */ - VCP_UI_RegisterProgressClass(); - if (!(VCP_UI_GetDialogTemplate(&template32))) - return VCPN_FAIL; - - if (vn_num > 10) /* hack */ - { - hDlgCopy = CreateDialogIndirectParamA(SETUPAPI_hInstance, template32, 0, - VCP_UI_FileCopyDlgProc, 0); - if (!hDlgCopy) - return VCPN_FAIL; - SetDlgItemTextA(hDlgCopy, SOURCESTRORD, "Scanning ..."); - SetDlgItemTextA(hDlgCopy, DESTSTRORD, "NOT_IMPLEMENTED_YET"); - } - strcpy(buf, REG_INSTALLEDFILES); - if (RegCreateKeyA(HKEY_LOCAL_MACHINE, buf, &hKeyFiles)) - return VCPN_FAIL; - strcat(buf, REGPART_RENAME); - if (RegCreateKeyA(HKEY_LOCAL_MACHINE, buf, &hKeyRename)) - return VCPN_FAIL; - if (RegCreateKeyA(HKEY_LOCAL_MACHINE, REG_VERSIONCONFLICT, &hKeyConflict)) - return VCPN_FAIL; - len = 1; - if (!(RegQueryValueExA(hKeyConflict, "Dirty", NULL, 0, (LPBYTE)&dirty, &len))) - { - /* FIXME: what does SETUPX.DLL do in this case ? */ - MESSAGE("Warning: another program using SETUPX is already running ! Failed.\n"); - return VCPN_FAIL; - } - dirty = TRUE; - if (RegSetValueExA(hKeyConflict, "Dirty", 0, REG_BINARY, (LPBYTE)&dirty, 1)) - return VCPN_FAIL; - len = 12; - if (!(RegQueryValueExA(hKeyConflict, "BackupDirectory", NULL, 0, BackupDir, &len))) - strcpy(BackupDir, "VCM"); - - /* create C:\WINDOWS\[BackupDir] and set registry key to it */ - GetWindowsDirectoryA(buf, 256); - strcat(buf, "\\"); - strcat(buf, BackupDir); - if (!(CreateDirectoryA(buf, NULL))) - return VCPN_FAIL; - if (RegSetValueExA(hKeyConflict, "BackupDirectory", 0, REG_SZ, (LPBYTE)buf, strlen(buf)+1)) - return VCPN_FAIL; - RegCloseKey(hKeyConflict); - - return VCPN_OK; -} - -/*********************************************************************** - * vcpUICallbackProc (SETUPX.213) - */ -RETERR16 WINAPI vcpUICallbackProc16(LPVOID lpvObj, UINT16 uMsg, WPARAM wParam, - LPARAM lParam, LPARAM lParamRef) -{ - static int count = 0; - RETERR16 res = VCPN_OK, cbres; - - if (count < 5) - FIXME("(%p, %04x, %04x, %08lx, %08lx) - semi-stub\n", - lpvObj, uMsg, wParam, lParam, lParamRef); - count++; - switch (uMsg) - { - /* unused messages, it seems */ - case VCPM_DISKPREPINFO: - - case VCPM_FILENEEDED: - - case VCPM_NODECREATE: - case VCPM_NODEACCEPT: - - case VCPM_VSTATCLOSESTART: - case VCPM_VSTATPATHCHECKSTART: - case VCPM_VSTATPATHCHECKEND: - - case VCPM_CHECKPATH: - break; - - /* the real stuff */ - case VCPM_NODECOMPARE: - res = VCP_UI_NodeCompare((LPVIRTNODE)lpvObj, (LPVIRTNODE)lParam); - break; - case VCPM_VSTATREAD: - break; - case VCPM_VSTATWRITE: - cbres = VCP_Callback(&vcp_status, VCPM_DISKPREPINFO, 0, 0, VCP_MsgRef); - break; - case VCPM_VSTATCLOSEEND: - RegCloseKey(hKeyFiles); - RegCloseKey(hKeyRename); - RegDeleteKeyA(HKEY_LOCAL_MACHINE, REG_VERSIONCONFLICT); - break; - case VCPM_VSTATCOPYSTART: - res = VCP_UI_CopyStart(); - break; - case VCPM_VSTATCOPYEND: - if (hDlgCopy) DestroyWindow(hDlgCopy); - break; - default: - FIXME("unhandled msg 0x%04x\n", uMsg); - } - return res; -}