Hans Leidekker : ntdll: Implement NtQuery/SetInformationToken( TokenDefaultDacl).
Alexandre Julliard
julliard at winehq.org
Tue Apr 21 11:45:46 CDT 2009
Module: wine
Branch: master
Commit: f483f71ad2bac670c2f2c297c3e096d623164aa3
URL: http://source.winehq.org/git/wine.git/?a=commit;h=f483f71ad2bac670c2f2c297c3e096d623164aa3
Author: Hans Leidekker <hans at codeweavers.com>
Date: Tue Apr 21 09:53:49 2009 +0200
ntdll: Implement NtQuery/SetInformationToken(TokenDefaultDacl).
---
dlls/advapi32/tests/security.c | 49 +++++++++++++++++++++++++++-
dlls/ntdll/nt.c | 69 ++++++++++++++++++++++++++++++++++++---
2 files changed, 110 insertions(+), 8 deletions(-)
diff --git a/dlls/advapi32/tests/security.c b/dlls/advapi32/tests/security.c
index f775d10..b68629d 100644
--- a/dlls/advapi32/tests/security.c
+++ b/dlls/advapi32/tests/security.c
@@ -1176,14 +1176,16 @@ static void test_AccessCheck(void)
static void test_token_attr(void)
{
HANDLE Token, ImpersonationToken;
- DWORD Size;
+ DWORD Size, Size2;
TOKEN_PRIVILEGES *Privileges;
TOKEN_GROUPS *Groups;
TOKEN_USER *User;
+ TOKEN_DEFAULT_DACL *Dacl;
BOOL ret;
DWORD i, GLE;
LPSTR SidString;
SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
+ ACL *acl;
/* cygwin-like use case */
SetLastError(0xdeadbeef);
@@ -1214,7 +1216,7 @@ static void test_token_attr(void)
}
SetLastError(0xdeadbeef);
- ret = OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY|TOKEN_DUPLICATE, &Token);
+ ret = OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, &Token);
ok(ret, "OpenProcessToken failed with error %d\n", GetLastError());
/* groups */
@@ -1283,6 +1285,49 @@ static void test_token_attr(void)
ok(ImpersonationLevel == SecurityAnonymous, "ImpersonationLevel should have been SecurityAnonymous instead of %d\n", ImpersonationLevel);
CloseHandle(ImpersonationToken);
+
+ /* default dacl */
+ ret = GetTokenInformation(Token, TokenDefaultDacl, NULL, 0, &Size);
+ ok(!ret && (GetLastError() == ERROR_INSUFFICIENT_BUFFER),
+ "GetTokenInformation(TokenDefaultDacl) failed with error %u\n", GetLastError());
+
+ Dacl = HeapAlloc(GetProcessHeap(), 0, Size);
+ ret = GetTokenInformation(Token, TokenDefaultDacl, Dacl, Size, &Size);
+ ok(ret, "GetTokenInformation(TokenDefaultDacl) failed with error %u\n", GetLastError());
+
+ SetLastError(0xdeadbeef);
+ ret = SetTokenInformation(Token, TokenDefaultDacl, NULL, 0);
+ GLE = GetLastError();
+ ok(!ret, "SetTokenInformation(TokenDefaultDacl) succeeded\n");
+ ok(GLE == ERROR_BAD_LENGTH, "expected ERROR_BAD_LENGTH got %u\n", GLE);
+
+ SetLastError(0xdeadbeef);
+ ret = SetTokenInformation(Token, TokenDefaultDacl, NULL, Size);
+ GLE = GetLastError();
+ ok(!ret, "SetTokenInformation(TokenDefaultDacl) succeeded\n");
+ ok(GLE == ERROR_NOACCESS, "expected ERROR_NOACCESS got %u\n", GLE);
+
+ acl = Dacl->DefaultDacl;
+ Dacl->DefaultDacl = NULL;
+
+ ret = SetTokenInformation(Token, TokenDefaultDacl, Dacl, Size);
+ ok(ret, "SetTokenInformation(TokenDefaultDacl) succeeded\n");
+
+ Size2 = 0;
+ Dacl->DefaultDacl = (ACL *)0xdeadbeef;
+ ret = GetTokenInformation(Token, TokenDefaultDacl, Dacl, Size, &Size2);
+ ok(ret, "GetTokenInformation(TokenDefaultDacl) failed with error %u\n", GetLastError());
+ ok(Dacl->DefaultDacl == NULL, "expected NULL, got %p\n", Dacl->DefaultDacl);
+ ok(Size2 == sizeof(TOKEN_DEFAULT_DACL), "got %u expected sizeof(TOKEN_DEFAULT_DACL)\n", Size2);
+
+ Dacl->DefaultDacl = acl;
+ ret = SetTokenInformation(Token, TokenDefaultDacl, Dacl, Size);
+ ok(ret, "SetTokenInformation(TokenDefaultDacl) failed with error %u\n", GetLastError());
+
+ ret = GetTokenInformation(Token, TokenDefaultDacl, Dacl, Size, &Size2);
+ ok(ret, "GetTokenInformation(TokenDefaultDacl) failed with error %u\n", GetLastError());
+
+ HeapFree(GetProcessHeap(), 0, Dacl);
CloseHandle(Token);
}
diff --git a/dlls/ntdll/nt.c b/dlls/ntdll/nt.c
index d2e133c..8ffa9e0 100644
--- a/dlls/ntdll/nt.c
+++ b/dlls/ntdll/nt.c
@@ -242,9 +242,6 @@ NTSTATUS WINAPI NtQueryInformationToken(
case TokenPrimaryGroup:
len = sizeof(TOKEN_PRIMARY_GROUP);
break;
- case TokenDefaultDacl:
- len = sizeof(TOKEN_DEFAULT_DACL);
- break;
case TokenSource:
len = sizeof(TOKEN_SOURCE);
break;
@@ -441,6 +438,31 @@ NTSTATUS WINAPI NtQueryInformationToken(
}
SERVER_END_REQ;
break;
+ case TokenDefaultDacl:
+ SERVER_START_REQ( get_token_default_dacl )
+ {
+ TOKEN_DEFAULT_DACL *default_dacl = tokeninfo;
+ ACL *acl = (ACL *)(default_dacl + 1);
+ DWORD acl_len;
+
+ if (tokeninfolength < sizeof(TOKEN_DEFAULT_DACL)) acl_len = 0;
+ else acl_len = tokeninfolength - sizeof(TOKEN_DEFAULT_DACL);
+
+ req->handle = wine_server_obj_handle( token );
+ wine_server_set_reply( req, acl, acl_len );
+ status = wine_server_call( req );
+
+ if (retlen) *retlen = reply->acl_len + sizeof(TOKEN_DEFAULT_DACL);
+ if (status == STATUS_SUCCESS)
+ {
+ if (reply->acl_len)
+ default_dacl->DefaultDacl = acl;
+ else
+ default_dacl->DefaultDacl = NULL;
+ }
+ }
+ SERVER_END_REQ;
+ break;
default:
{
ERR("Unhandled Token Information class %d!\n", tokeninfoclass);
@@ -460,9 +482,44 @@ NTSTATUS WINAPI NtSetInformationToken(
PVOID TokenInformation,
ULONG TokenInformationLength)
{
- FIXME("%p %d %p %u\n", TokenHandle, TokenInformationClass,
- TokenInformation, TokenInformationLength);
- return STATUS_NOT_IMPLEMENTED;
+ NTSTATUS ret = STATUS_NOT_IMPLEMENTED;
+
+ TRACE("%p %d %p %u\n", TokenHandle, TokenInformationClass,
+ TokenInformation, TokenInformationLength);
+
+ switch (TokenInformationClass)
+ {
+ case TokenDefaultDacl:
+ if (TokenInformationLength < sizeof(TOKEN_DEFAULT_DACL))
+ {
+ ret = STATUS_INFO_LENGTH_MISMATCH;
+ break;
+ }
+ if (!TokenInformation)
+ {
+ ret = STATUS_ACCESS_VIOLATION;
+ break;
+ }
+ SERVER_START_REQ( set_token_default_dacl )
+ {
+ ACL *acl = ((TOKEN_DEFAULT_DACL *)TokenInformation)->DefaultDacl;
+ WORD size;
+
+ if (acl) size = acl->AclSize;
+ else size = 0;
+
+ req->handle = wine_server_obj_handle( TokenHandle );
+ wine_server_add_data( req, acl, size );
+ ret = wine_server_call( req );
+ }
+ SERVER_END_REQ;
+ break;
+ default:
+ FIXME("unimplemented class %u\n", TokenInformationClass);
+ break;
+ }
+
+ return ret;
}
/******************************************************************************
More information about the wine-cvs
mailing list