Ge van Geldorp : schannel/tests: Fix crash on Win7.

Alexandre Julliard julliard at winehq.org
Tue Oct 6 10:35:49 CDT 2009


Module: wine
Branch: master
Commit: 875d3b9799dc15cab2c075f22e4a4778f09980fc
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=875d3b9799dc15cab2c075f22e4a4778f09980fc

Author: Ge van Geldorp <ggeldorp at vmware.com>
Date:   Mon Sep 17 00:00:00 2001 +0200

schannel/tests: Fix crash on Win7.

---

 dlls/schannel/lsamode.c    |   14 +++++++++++++-
 dlls/schannel/tests/main.c |   35 ++++++++++++++++++++++++++++++++---
 include/ntsecpkg.h         |   29 +++++++++++++++++++++++++++++
 3 files changed, 74 insertions(+), 4 deletions(-)

diff --git a/dlls/schannel/lsamode.c b/dlls/schannel/lsamode.c
index 23d8599..f43150e 100644
--- a/dlls/schannel/lsamode.c
+++ b/dlls/schannel/lsamode.c
@@ -109,6 +109,12 @@ static SECPKG_FUNCTION_TABLE secPkgFunctionTable[2] =
     NULL, /* SetExtendedInformation */
     NULL, /* SetContextAttributes */
     NULL, /* SetCredentialsAttributes */
+    NULL, /* ChangeAccountPassword */
+    NULL, /* QueryMetaData */
+    NULL, /* ExchangeMetaData */
+    NULL, /* GetCredUIContext */
+    NULL, /* UpdateCredentials */
+    NULL, /* ValidateTargetInfo */
   }, {
     NULL, /* InitializePackage */
     NULL, /* LsaLogonUser */
@@ -139,6 +145,12 @@ static SECPKG_FUNCTION_TABLE secPkgFunctionTable[2] =
     NULL, /* SetExtendedInformation */
     NULL, /* SetContextAttributes */
     NULL, /* SetCredentialsAttributes */
+    NULL, /* ChangeAccountPassword */
+    NULL, /* QueryMetaData */
+    NULL, /* ExchangeMetaData */
+    NULL, /* GetCredUIContext */
+    NULL, /* UpdateCredentials */
+    NULL, /* ValidateTargetInfo */
   }
 };
 
@@ -150,7 +162,7 @@ NTSTATUS WINAPI SpLsaModeInitialize(ULONG LsaVersion, PULONG PackageVersion,
 {
     TRACE("(%u, %p, %p, %p)\n", LsaVersion, PackageVersion, ppTables, pcTables);
 
-    *PackageVersion = SECPKG_INTERFACE_VERSION_3;
+    *PackageVersion = SECPKG_INTERFACE_VERSION_6;
     *pcTables = 2;
     *ppTables = secPkgFunctionTable;
 
diff --git a/dlls/schannel/tests/main.c b/dlls/schannel/tests/main.c
index d05275f..b576848 100644
--- a/dlls/schannel/tests/main.c
+++ b/dlls/schannel/tests/main.c
@@ -37,7 +37,13 @@
     SetContextAttributes)
 #define SECPKG_FUNCTION_TABLE_SIZE_2 FIELD_OFFSET(SECPKG_FUNCTION_TABLE, \
     SetCredentialsAttributes)
-#define SECPKG_FUNCTION_TABLE_SIZE_3 sizeof(SECPKG_FUNCTION_TABLE)
+#define SECPKG_FUNCTION_TABLE_SIZE_3 FIELD_OFFSET(SECPKG_FUNCTION_TABLE, \
+    ChangeAccountPassword)
+#define SECPKG_FUNCTION_TABLE_SIZE_4 FIELD_OFFSET(SECPKG_FUNCTION_TABLE, \
+    QueryMetaData)
+#define SECPKG_FUNCTION_TABLE_SIZE_5 FIELD_OFFSET(SECPKG_FUNCTION_TABLE, \
+    ValidateTargetInfo)
+#define SECPKG_FUNCTION_TABLE_SIZE_6 sizeof(SECPKG_FUNCTION_TABLE)
 
 static NTSTATUS (NTAPI *pSpLsaModeInitialize)(ULONG, PULONG,
     PSECPKG_FUNCTION_TABLE*, PULONG);
@@ -121,6 +127,7 @@ static PSECPKG_FUNCTION_TABLE getNextSecPkgTable(PSECPKG_FUNCTION_TABLE pTable,
                                                  ULONG Version)
 {
     size_t size;
+    PSECPKG_FUNCTION_TABLE pNextTable;
 
     if (Version == SECPKG_INTERFACE_VERSION)
         size = SECPKG_FUNCTION_TABLE_SIZE_1;
@@ -128,12 +135,32 @@ static PSECPKG_FUNCTION_TABLE getNextSecPkgTable(PSECPKG_FUNCTION_TABLE pTable,
         size = SECPKG_FUNCTION_TABLE_SIZE_2;
     else if (Version == SECPKG_INTERFACE_VERSION_3)
         size = SECPKG_FUNCTION_TABLE_SIZE_3;
+    else if (Version == SECPKG_INTERFACE_VERSION_4)
+        size = SECPKG_FUNCTION_TABLE_SIZE_4;
+    else if (Version == SECPKG_INTERFACE_VERSION_5)
+        size = SECPKG_FUNCTION_TABLE_SIZE_5;
+    else if (Version == SECPKG_INTERFACE_VERSION_6)
+        size = SECPKG_FUNCTION_TABLE_SIZE_6;
     else {
         ok(FALSE, "Unknown package version 0x%x\n", Version);
         return NULL;
     }
 
-    return (PSECPKG_FUNCTION_TABLE)((PBYTE)pTable + size);
+    pNextTable = (PSECPKG_FUNCTION_TABLE)((PBYTE)pTable + size);
+    /* Win7 function tables appear to be SECPKG_INTERFACE_VERSION_6 format,
+       but unfortunately SpLsaModeInitialize returns SECPKG_INTERFACE_VERSION_3.
+       We detect that by comparing the "Initialize" pointer from the old table
+       to the "FreeCredentialsHandle" pointer of the new table. These functions
+       have different numbers of arguments, so they can't possibly point to the
+       same implementation */
+    if (broken((void *) pTable->Initialize == (void *) pNextTable->FreeCredentialsHandle &&
+               pNextTable->FreeCredentialsHandle != NULL))
+    {
+        win_skip("Invalid function pointers for next package\n");
+        return NULL;
+    }
+
+    return pNextTable;
 }
 
 static void testGetInfo(void)
@@ -181,7 +208,9 @@ static void testGetInfo(void)
            PackageInfo.fCapabilities);
         ok(PackageInfo.wVersion == 1, "wVersion: %d\n", PackageInfo.wVersion);
         ok(PackageInfo.wRPCID == 14, "wRPCID: %d\n", PackageInfo.wRPCID);
-        ok(PackageInfo.cbMaxToken == 0x4000, "cbMaxToken: 0x%x\n",
+        ok(PackageInfo.cbMaxToken == 0x4000 ||
+           PackageInfo.cbMaxToken == 0x6000, /* Win7 */
+           "cbMaxToken: 0x%x\n",
            PackageInfo.cbMaxToken);
     }
 }
diff --git a/include/ntsecpkg.h b/include/ntsecpkg.h
index e887360..b83d364 100644
--- a/include/ntsecpkg.h
+++ b/include/ntsecpkg.h
@@ -34,6 +34,9 @@ extern "C" {
 #define SECPKG_INTERFACE_VERSION                     0x10000
 #define SECPKG_INTERFACE_VERSION_2                   0x20000
 #define SECPKG_INTERFACE_VERSION_3                   0x40000
+#define SECPKG_INTERFACE_VERSION_4                   0x80000
+#define SECPKG_INTERFACE_VERSION_5                  0x100000
+#define SECPKG_INTERFACE_VERSION_6                  0x200000
 
 /* enum definitions for Secure Service Provider/Authentication Packages */
 typedef enum _LSA_TOKEN_INFORMATION_TYPE {
@@ -144,6 +147,11 @@ typedef struct _SECPKG_EXTENDED_INFORMATION {
     } Info;
 } SECPKG_EXTENDED_INFORMATION, *PSECPKG_EXTENDED_INFORMATION;
 
+typedef struct  _SECPKG_TARGETINFO {
+    PSID DomainSid;
+    PCWSTR ComputerName;
+} SECPKG_TARGETINFO, *PSECPKG_TARGETINFO;
+
 /* callbacks implemented by SSP/AP dlls and called by the LSA */
 typedef VOID (NTAPI *PLSA_CALLBACK_FUNCTION)(ULONG_PTR, ULONG_PTR, PSecBuffer,
  PSecBuffer);
@@ -345,6 +353,18 @@ typedef NTSTATUS (NTAPI SpSetContextAttributesFn)(LSA_SEC_HANDLE, ULONG, PVOID,
  ULONG);
 typedef NTSTATUS (NTAPI SpSetCredentialsAttributesFn)(LSA_SEC_HANDLE, ULONG,
  PVOID, ULONG);
+typedef NTSTATUS (NTAPI SpChangeAccountPasswordFn)(PUNICODE_STRING,
+ PUNICODE_STRING, PUNICODE_STRING, PUNICODE_STRING, BOOLEAN, PSecBufferDesc);
+typedef NTSTATUS (NTAPI SpQueryMetaDataFn)(LSA_SEC_HANDLE, PUNICODE_STRING,
+ ULONG, PULONG, PUCHAR *, PLSA_SEC_HANDLE);
+typedef NTSTATUS (NTAPI SpExchangeMetaDataFn)(LSA_SEC_HANDLE, PUNICODE_STRING,
+ ULONG, ULONG, PUCHAR, PLSA_SEC_HANDLE);
+typedef NTSTATUS (NTAPI SpGetCredUIContextFn)(LSA_SEC_HANDLE, GUID *, PULONG,
+ PUCHAR *);
+typedef NTSTATUS (NTAPI SpUpdateCredentialsFn)(LSA_SEC_HANDLE, GUID *, ULONG,
+ PUCHAR);
+typedef NTSTATUS (NTAPI SpValidateTargetInfoFn)(PLSA_CLIENT_REQUEST, PVOID,
+ PVOID, ULONG, PSECPKG_TARGETINFO);
 
 /* User-mode functions implemented by SSP/AP obtainable by a dispatch table */
 typedef NTSTATUS (NTAPI SpInstanceInitFn)(ULONG, PSECPKG_DLL_FUNCTIONS,
@@ -406,6 +426,15 @@ typedef struct SECPKG_FUNCTION_TABLE {
     /* Packages with version SECPKG_INTERFACE_VERSION_2 end here */
     SpSetCredentialsAttributesFn *SetCredentialsAttributes;
     /* Packages with version SECPKG_INTERFACE_VERSION_3 end here */
+    SpChangeAccountPasswordFn *ChangeAccountPassword;
+    /* Packages with version SECPKG_INTERFACE_VERSION_4 end here */
+    SpQueryMetaDataFn *QueryMetaData;
+    SpExchangeMetaDataFn *ExchangeMetaData;
+    SpGetCredUIContextFn *GetCredUIContext;
+    SpUpdateCredentialsFn *UpdateCredentials;
+    /* Packages with version SECPKG_INTERFACE_VERSION_5 end here */
+    SpValidateTargetInfoFn *ValidateTargetInfo;
+    /* Packages with version SECPKG_INTERFACE_VERSION_6 end here */
 } SECPKG_FUNCTION_TABLE,
  *PSECPKG_FUNCTION_TABLE;
 




More information about the wine-cvs mailing list