advpack: add two missing stubs

Robert Reif reif at earthlink.net
Mon Jan 10 22:17:21 CST 2005


Robert Reif wrote:

> Robert Reif wrote:
>
>> Add stubs for NeedReboot and NeedRebootInit.
>>
> without FIXME bug

This time with three more functions implemented and some tests.

Some of the new code was borrowed from reactos. GetVersionFromFile*
is badly broken in reactos so I don't really trust IsNTAdmin.  I
only tested this against an XP native dll so I don't know how win9x
will do.  Also only tested with English.

Please look over this carefully.
-------------- next part --------------
Index: configure.ac
===================================================================
RCS file: /home/wine/wine/configure.ac,v
retrieving revision 1.333
diff -u -r1.333 configure.ac
--- configure.ac	10 Jan 2005 13:26:33 -0000	1.333
+++ configure.ac	11 Jan 2005 03:58:01 -0000
@@ -1511,6 +1511,7 @@
 dlls/advapi32/Makefile
 dlls/advapi32/tests/Makefile
 dlls/advpack/Makefile
+dlls/advpack/tests/Makefile
 dlls/amstream/Makefile
 dlls/atl/Makefile
 dlls/avicap32/Makefile
Index: dlls/advpack/Makefile.in
===================================================================
RCS file: /home/wine/wine/dlls/advpack/Makefile.in,v
retrieving revision 1.1
diff -u -r1.1 Makefile.in
--- dlls/advpack/Makefile.in	27 Sep 2004 20:39:40 -0000	1.1
+++ dlls/advpack/Makefile.in	11 Jan 2005 03:58:01 -0000
@@ -3,12 +3,14 @@
 SRCDIR    = @srcdir@
 VPATH     = @srcdir@
 MODULE    = advpack.dll
-IMPORTS   = setupapi user32 kernel32 ntdll
+IMPORTS   = setupapi user32 kernel32 ntdll version advapi32
 EXTRALIBS = $(LIBUNICODE)
 
 C_SRCS = \
 	advpack.c \
 	reg.c
+
+SUBDIRS = tests
 
 @MAKE_DLL_RULES@
 
Index: dlls/advpack/advpack.c
===================================================================
RCS file: /home/wine/wine/dlls/advpack/advpack.c,v
retrieving revision 1.6
diff -u -r1.6 advpack.c
--- dlls/advpack/advpack.c	15 Dec 2004 10:52:57 -0000	1.6
+++ dlls/advpack/advpack.c	11 Jan 2005 03:58:02 -0000
@@ -24,6 +24,8 @@
 #include "winbase.h"
 #include "winuser.h"
 #include "winreg.h"
+#include "winver.h"
+#include "winnls.h"
 #include "setupapi.h"
 #include "advpub.h"
 #include "wine/debug.h"
@@ -95,4 +97,139 @@
     SetupCloseInfFile(hinf);
 
     return ret;
+}
+
+/***********************************************************************
+ *		NeedRebootInit	(ADVPACK.@)
+ */
+DWORD WINAPI NeedRebootInit(VOID)
+{
+    FIXME("() stub!\n");
+
+    SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+
+    return 0;
+}
+
+/***********************************************************************
+ *		NeedReboot	(ADVPACK.@)
+ */
+BOOL WINAPI NeedReboot(DWORD dwRebootCheck)
+{
+    FIXME("(0x%08lx) stub!\n", dwRebootCheck);
+
+    SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+
+    return FALSE;
+}
+
+/***********************************************************************
+ *		GetVersionFromFileEx	(ADVPACK.@)
+ */
+HRESULT WINAPI GetVersionFromFileEx( LPSTR lpszFilename, LPDWORD pdwMSVer,
+                                     LPDWORD pdwLSVer, BOOL bVersion )
+{
+    DWORD hdl, retval;
+    LPVOID pVersionInfo;
+    BOOL boolret;
+    VS_FIXEDFILEINFO *pFixedVersionInfo;
+    UINT uiLength;
+    TRACE("(%s, %p, %p, %d)\n", lpszFilename, pdwMSVer, pdwLSVer, bVersion);
+
+    if (bVersion)
+    {
+        retval = GetFileVersionInfoSizeA(lpszFilename, &hdl);
+        if (retval == 0 || hdl != 0)
+            return E_FAIL;
+
+        pVersionInfo = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, retval);
+        if (pVersionInfo == NULL)
+             return E_FAIL;
+
+        GetFileVersionInfoA( lpszFilename, 0, retval, pVersionInfo);
+
+        boolret = VerQueryValueA(pVersionInfo, "\\",
+                                 (LPVOID) &pFixedVersionInfo, &uiLength);
+
+        HeapFree(GetProcessHeap(), 0, pVersionInfo);
+
+	if (boolret)
+        {
+            *pdwMSVer = pFixedVersionInfo->dwFileVersionMS;
+            *pdwLSVer = pFixedVersionInfo->dwFileVersionLS;
+        }
+        else
+            return E_FAIL;
+    }
+    else
+    {
+        *pdwMSVer = GetUserDefaultUILanguage();
+        *pdwLSVer = GetACP();
+    }
+
+    return S_OK;
+}
+
+/***********************************************************************
+ *		GetVersionFromFile	(ADVPACK.@)
+ */
+HRESULT WINAPI GetVersionFromFile( LPSTR Filename, LPDWORD MajorVer,
+                                   LPDWORD MinorVer, BOOL Version )
+{
+    TRACE("(%s, %p, %p, %d)\n", Filename, MajorVer, MinorVer, Version);
+
+    return GetVersionFromFileEx(Filename, MajorVer, MinorVer, Version);
+}
+
+/***********************************************************************
+ *              IsNTAdmin	(ADVPACK.@)
+ */
+BOOL WINAPI IsNTAdmin( DWORD Reserved, PDWORD PReserved )
+{
+    HANDLE Process, Token;
+    INT i;
+    BOOL Good = FALSE;
+    DWORD Buffer[4096];
+    DWORD Size;
+    PTOKEN_GROUPS TokenGrp = (PTOKEN_GROUPS) Buffer;
+    SID_IDENTIFIER_AUTHORITY AuthSid = {SECURITY_NT_AUTHORITY};
+    PSID psid = NULL;
+
+    Process = GetCurrentProcess();
+
+    if ( OpenProcessToken(Process, TOKEN_QUERY, &Token) == FALSE)
+    {
+        CloseHandle(Process);
+        return FALSE;
+    }
+
+    if ( GetTokenInformation( Token, TokenGroups, Buffer, 4096, &Size) == FALSE)
+    {
+        CloseHandle(Process);
+        CloseHandle(Token);
+        return FALSE;
+    }
+
+    CloseHandle(Process);
+    CloseHandle(Token);
+
+    if ( AllocateAndInitializeSid( &AuthSid, 2, SECURITY_BUILTIN_DOMAIN_RID,
+                                   DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0,
+                                   &psid) == FALSE)
+    {
+        return FALSE;
+    }
+
+    for ( i = 0; i < TokenGrp->GroupCount; i++ )
+    {
+         if ( EqualSid( psid , TokenGrp->Groups[i].Sid) != FALSE )
+         {
+             Good = TRUE;
+             break;
+         }
+    }
+
+    FreeSid( psid);
+
+    return Good;
 }
Index: dlls/advpack/advpack.spec
===================================================================
RCS file: /home/wine/wine/dlls/advpack/advpack.spec,v
retrieving revision 1.4
diff -u -r1.4 advpack.spec
--- dlls/advpack/advpack.spec	15 Dec 2004 10:52:57 -0000	1.4
+++ dlls/advpack/advpack.spec	11 Jan 2005 03:58:02 -0000
@@ -10,13 +10,13 @@
 @ stub FileSaveMarkNotExist
 @ stub FileSaveRestore
 @ stub FileSaveRestoreOnINF
-@ stub GetVersionFromFile
-@ stub GetVersionFromFileEx
-@ stub IsNTAdmin
+@ stdcall GetVersionFromFile(str ptr ptr long)
+@ stdcall GetVersionFromFileEx(str ptr ptr long)
+@ stdcall IsNTAdmin(long ptr)
 @ stdcall LaunchINFSection(ptr ptr str long)
 @ stdcall LaunchINFSectionEx(ptr ptr str long)
-@ stub NeedReboot
-@ stub NeedRebootInit
+@ stdcall NeedReboot(long)
+@ stdcall NeedRebootInit()
 @ stub OpenINFEngine
 @ stub RebootCheckOnInstall
 @ stdcall RegInstall(ptr str ptr)
Index: include/advpub.h
===================================================================
RCS file: /home/wine/wine/include/advpub.h,v
retrieving revision 1.1
diff -u -r1.1 advpub.h
--- include/advpub.h	27 Sep 2004 20:39:40 -0000	1.1
+++ include/advpub.h	11 Jan 2005 03:58:14 -0000
@@ -39,6 +39,10 @@
 typedef CSTRTABLE *LPCSTRTABLE;
 
 HRESULT WINAPI RegInstall(HMODULE hm, LPCSTR pszSection, LPCSTRTABLE pstTable);
+DWORD WINAPI NeedRebootInit(VOID);
+BOOL WINAPI NeedReboot(DWORD dwRebootCheck);
+HRESULT WINAPI GetVersionFromFile(LPSTR lpszFilename, LPDWORD pdwMSVer, LPDWORD pdwLSVer, BOOL bVersion);
+BOOL WINAPI IsNTAdmin( DWORD dwReserved, DWORD *lpdwReserved );
 
 #ifdef __cplusplus
 }


More information about the wine-devel mailing list