diff --git a/dlls/schannel/lsamode.c b/dlls/schannel/lsamode.c index 23d85994cc4..f43150e3d3a 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 d05275fd37d..b5768481ec8 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 e88736012fa..b83d364544b 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;