- implementation of RtlReg* (read access), RtlEvent*, RtlSemaphore*, NtAllocateLocallyUniqueId - implementation or stubs for NtAccessCheck, NtSetSecurityObject, RtlClearBits, RtlEqualPrefixSid, RtlFindClearBits, RtlFormatCurrentUserKeyPath, RtlGetControlSecurityDescriptor, RtlIdentifierAuthoritySid, RtlImpersonateSelf, RtlInitializeBitMap, RtlInitializeGenericTable, RtlMakeSelfRelativeSD, RtlPrefixUnicodeString, RtlSetBits, RtlUnicodeToMultiByteN, RtlUpcaseUnicodeStringToOemString, RtlUpcaseUnicodeToOemN, RtlValidSid, RtlxUnicodeStringToOemSize - corrected most RtlString* functions, added documentation - more fixes and partial implementations
diff --git a/dlls/advapi32/advapi32.spec b/dlls/advapi32/advapi32.spec index 2c478f4..0d266a5 100644 --- a/dlls/advapi32/advapi32.spec +++ b/dlls/advapi32/advapi32.spec
@@ -112,7 +112,7 @@ @ stub ImpersonateLoggedOnUser @ stub ImpersonateNamedPipeClient @ stdcall ImpersonateSelf(long) ImpersonateSelf -@ stub InitializeAcl +@ stdcall InitializeAcl(ptr long long) InitializeAcl @ stdcall InitializeSecurityDescriptor(ptr long) InitializeSecurityDescriptor @ stdcall InitializeSid(ptr ptr long) InitializeSid @ stub InitiateSystemShutdownA @@ -224,7 +224,7 @@ @ stub SetAclInformation @ stdcall SetFileSecurityA(str long ptr ) SetFileSecurityA @ stdcall SetFileSecurityW(wstr long ptr) SetFileSecurityW -@ stub SetKernelObjectSecurity +@ stdcall SetKernelObjectSecurity(long long ptr) SetKernelObjectSecurity @ stub SetPrivateObjectSecurity @ stdcall SetSecurityDescriptorDacl(ptr long ptr long) SetSecurityDescriptorDacl @ stdcall SetSecurityDescriptorGroup (ptr ptr long) SetSecurityDescriptorGroup @@ -241,7 +241,7 @@ @ stdcall StartServiceW(long long ptr) StartServiceW @ stub UnlockServiceDatabase @ stdcall LsaOpenPolicy(long long long long) LsaOpenPolicy -@ stub LsaLookupSids +@ stdcall LsaLookupSids(ptr long ptr ptr ptr) LsaLookupSids @ stdcall LsaFreeMemory(ptr)LsaFreeMemory @ stdcall LsaQueryInformationPolicy(ptr long ptr)LsaQueryInformationPolicy @ stdcall LsaClose(ptr)LsaClose
diff --git a/dlls/advapi32/security.c b/dlls/advapi32/security.c index 1e61f1b..d98fe65 100644 --- a/dlls/advapi32/security.c +++ b/dlls/advapi32/security.c
@@ -10,24 +10,11 @@ #include "ntddk.h" #include "ntsecapi.h" #include "debugtools.h" +#include "winversion.h" DEFAULT_DEBUG_CHANNEL(advapi) DECLARE_DEBUG_CHANNEL(security) - -static BOOL Wine_HasSecurity(void) -{ - OSVERSIONINFOA osi; - osi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOA); - GetVersionExA(&osi); - if (osi.dwPlatformId != VER_PLATFORM_WIN32_NT) { - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return FALSE; - } - return TRUE; -} - - #define CallWin32ToNt(func) \ { NTSTATUS ret; \ ret = (func); \ @@ -36,6 +23,17 @@ return TRUE; \ } +static void dumpLsaAttributes( PLSA_OBJECT_ATTRIBUTES oa ) +{ + if (oa) + { + TRACE("\n\tlength=%lu, rootdir=0x%08x, objectname=%s\n\tattr=0x%08lx, sid=%p qos=%p\n", + oa->Length, oa->RootDirectory, + oa->ObjectName?debugstr_w(oa->ObjectName->Buffer):"null", + oa->Attributes, oa->SecurityDescriptor, oa->SecurityQualityOfService); + } +} + /* ############################## ###### TOKEN FUNCTIONS ###### ############################## @@ -56,7 +54,6 @@ OpenProcessToken( HANDLE ProcessHandle, DWORD DesiredAccess, HANDLE *TokenHandle ) { - if (!Wine_HasSecurity()) return FALSE; CallWin32ToNt(NtOpenProcessToken( ProcessHandle, DesiredAccess, TokenHandle )); } @@ -73,7 +70,6 @@ OpenThreadToken( HANDLE ThreadHandle, DWORD DesiredAccess, BOOL OpenAsSelf, HANDLE *TokenHandle) { - if (!Wine_HasSecurity()) return FALSE; CallWin32ToNt (NtOpenThreadToken(ThreadHandle, DesiredAccess, OpenAsSelf, TokenHandle)); } @@ -114,6 +110,25 @@ CallWin32ToNt (NtQueryInformationToken( token, tokeninfoclass, tokeninfo, tokeninfolength, retlen)); } +/************************************************************************* + * SetThreadToken [ADVAPI32.231] + * + * Assigns an "impersonation token" to a thread so it can assume the + * security privledges of another thread or process. Can also remove + * a previously assigned token. Only supported on NT - it's a stub + * exactly like this one on Win9X. + * + */ + +BOOL WINAPI SetThreadToken(PHANDLE thread, HANDLE token) +{ + FIXME("(%p, %x): stub\n", thread, token); + + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + + return FALSE; +} + /* ############################## ###### SID FUNCTIONS ###### ############################## @@ -144,33 +159,11 @@ DWORD nSubAuthority6, DWORD nSubAuthority7, PSID *pSid ) { - if (!(*pSid = HeapAlloc( GetProcessHeap(), 0, - GetSidLengthRequired(nSubAuthorityCount)))) - return FALSE; - (*pSid)->Revision = SID_REVISION; - if (pIdentifierAuthority) - memcpy(&(*pSid)->IdentifierAuthority, pIdentifierAuthority, - sizeof (SID_IDENTIFIER_AUTHORITY)); - *GetSidSubAuthorityCount(*pSid) = nSubAuthorityCount; - - if (nSubAuthorityCount > 0) - *GetSidSubAuthority(*pSid, 0) = nSubAuthority0; - if (nSubAuthorityCount > 1) - *GetSidSubAuthority(*pSid, 1) = nSubAuthority1; - if (nSubAuthorityCount > 2) - *GetSidSubAuthority(*pSid, 2) = nSubAuthority2; - if (nSubAuthorityCount > 3) - *GetSidSubAuthority(*pSid, 3) = nSubAuthority3; - if (nSubAuthorityCount > 4) - *GetSidSubAuthority(*pSid, 4) = nSubAuthority4; - if (nSubAuthorityCount > 5) - *GetSidSubAuthority(*pSid, 5) = nSubAuthority5; - if (nSubAuthorityCount > 6) - *GetSidSubAuthority(*pSid, 6) = nSubAuthority6; - if (nSubAuthorityCount > 7) - *GetSidSubAuthority(*pSid, 7) = nSubAuthority7; - - return TRUE; + CallWin32ToNt (RtlAllocateAndInitializeSid( + pIdentifierAuthority, nSubAuthorityCount, + nSubAuthority0, nSubAuthority1, nSubAuthority2, nSubAuthority3, + nSubAuthority4, nSubAuthority5, nSubAuthority6, nSubAuthority7, + pSid )); } /****************************************************************************** @@ -182,8 +175,8 @@ PVOID WINAPI FreeSid( PSID pSid ) { - HeapFree( GetProcessHeap(), 0, pSid ); - return NULL; + RtlFreeSid(pSid); + return NULL; /* is documented like this */ } /****************************************************************************** @@ -197,16 +190,7 @@ BOOL WINAPI CopySid( DWORD nDestinationSidLength, PSID pDestinationSid, PSID pSourceSid ) { - - if (!IsValidSid(pSourceSid)) - return FALSE; - - if (nDestinationSidLength < GetLengthSid(pSourceSid)) - return FALSE; - - memcpy(pDestinationSid, pSourceSid, GetLengthSid(pSourceSid)); - - return TRUE; + return RtlCopySid(nDestinationSidLength, pDestinationSid, pSourceSid); } /****************************************************************************** @@ -218,19 +202,7 @@ BOOL WINAPI IsValidSid( PSID pSid ) { - if (IsBadReadPtr(pSid, 4)) - { - WARN_(security)("(%p): invalid pointer!", pSid); - return FALSE; - } - - if (pSid->SubAuthorityCount > SID_MAX_SUB_AUTHORITIES) - return FALSE; - - if (!pSid || pSid->Revision != SID_REVISION) - return FALSE; - - return TRUE; + return RtlValidSid( pSid ); } /****************************************************************************** @@ -243,33 +215,15 @@ BOOL WINAPI EqualSid( PSID pSid1, PSID pSid2 ) { - if (!IsValidSid(pSid1) || !IsValidSid(pSid2)) - return FALSE; - - if (*GetSidSubAuthorityCount(pSid1) != *GetSidSubAuthorityCount(pSid2)) - return FALSE; - - if (memcmp(pSid1, pSid2, GetLengthSid(pSid1)) != 0) - return FALSE; - - return TRUE; + return RtlEqualSid( pSid1, pSid2 ); } /****************************************************************************** * EqualPrefixSid [ADVAPI32.39] */ -BOOL WINAPI EqualPrefixSid (PSID pSid1, PSID pSid2) { - if (!IsValidSid(pSid1) || !IsValidSid(pSid2)) - return FALSE; - - if (*GetSidSubAuthorityCount(pSid1) != *GetSidSubAuthorityCount(pSid2)) - return FALSE; - - if (memcmp(pSid1, pSid2, GetSidLengthRequired(pSid1->SubAuthorityCount - 1)) - != 0) - return FALSE; - - return TRUE; +BOOL WINAPI EqualPrefixSid (PSID pSid1, PSID pSid2) +{ + return RtlEqualPrefixSid(pSid1, pSid2); } /****************************************************************************** @@ -281,7 +235,7 @@ DWORD WINAPI GetSidLengthRequired( BYTE nSubAuthorityCount ) { - return sizeof (SID) + (nSubAuthorityCount - 1) * sizeof (DWORD); + return RtlLengthRequiredSid(nSubAuthorityCount); } /****************************************************************************** @@ -291,21 +245,12 @@ * pIdentifierAuthority [] */ BOOL WINAPI -InitializeSid (PSID pSid, PSID_IDENTIFIER_AUTHORITY pIdentifierAuthority, - BYTE nSubAuthorityCount) +InitializeSid ( + PSID pSid, + PSID_IDENTIFIER_AUTHORITY pIdentifierAuthority, + BYTE nSubAuthorityCount) { - int i; - - pSid->Revision = SID_REVISION; - if (pIdentifierAuthority) - memcpy(&pSid->IdentifierAuthority, pIdentifierAuthority, - sizeof (SID_IDENTIFIER_AUTHORITY)); - *GetSidSubAuthorityCount(pSid) = nSubAuthorityCount; - - for (i = 0; i < nSubAuthorityCount; i++) - *GetSidSubAuthority(pSid, i) = 0; - - return TRUE; + return RtlInitializeSid(pSid, pIdentifierAuthority, nSubAuthorityCount); } /****************************************************************************** @@ -317,7 +262,7 @@ PSID_IDENTIFIER_AUTHORITY WINAPI GetSidIdentifierAuthority( PSID pSid ) { - return &pSid->IdentifierAuthority; + return RtlIdentifierAuthoritySid(pSid); } /****************************************************************************** @@ -330,7 +275,7 @@ PDWORD WINAPI GetSidSubAuthority( PSID pSid, DWORD nSubAuthority ) { - return &pSid->SubAuthority[nSubAuthority]; + return RtlSubAuthoritySid(pSid, nSubAuthority); } /****************************************************************************** @@ -342,7 +287,7 @@ PUCHAR WINAPI GetSidSubAuthorityCount (PSID pSid) { - return &pSid->SubAuthorityCount; + return RtlSubAuthorityCountSid(pSid); } /****************************************************************************** @@ -354,7 +299,7 @@ DWORD WINAPI GetLengthSid (PSID pSid) { - return GetSidLengthRequired( * GetSidSubAuthorityCount(pSid) ); + return RtlLengthSid(pSid); } /* ############################################## @@ -472,14 +417,14 @@ OUT PACL *pSacl, OUT LPBOOL lpbSaclDefaulted) { - CallWin32ToNt (RtlGetSaclSecurityDescriptor(lpsd, (PBOOLEAN)lpbSaclPresent, - pSacl, (PBOOLEAN)lpbSaclDefaulted)); + CallWin32ToNt (RtlGetSaclSecurityDescriptor(lpsd, + (PBOOLEAN)lpbSaclPresent, pSacl, (PBOOLEAN)lpbSaclDefaulted)); } /************************************************************************** * SetSecurityDescriptorSacl [NTDLL.488] */ -BOOL WINAPI SetSecurityDescriptorSacl ( +BOOL WINAPI SetSecurityDescriptorSacl ( PSECURITY_DESCRIPTOR lpsd, BOOL saclpresent, PACL lpsacl, @@ -496,11 +441,12 @@ * lpbuflen [] */ BOOL WINAPI -MakeSelfRelativeSD( PSECURITY_DESCRIPTOR lpabssecdesc, - PSECURITY_DESCRIPTOR lpselfsecdesc, LPDWORD lpbuflen ) +MakeSelfRelativeSD( + IN PSECURITY_DESCRIPTOR pAbsoluteSecurityDescriptor, + IN PSECURITY_DESCRIPTOR pSelfRelativeSecurityDescriptor, + IN OUT LPDWORD lpdwBufferLength) { - FIXME("(%p,%p,%p),stub!\n",lpabssecdesc,lpselfsecdesc,lpbuflen); - return TRUE; + CallWin32ToNt (RtlMakeSelfRelativeSD(pAbsoluteSecurityDescriptor,pSelfRelativeSecurityDescriptor, lpdwBufferLength)); } /****************************************************************************** @@ -509,11 +455,24 @@ BOOL WINAPI GetSecurityDescriptorControl ( PSECURITY_DESCRIPTOR pSecurityDescriptor, PSECURITY_DESCRIPTOR_CONTROL pControl, LPDWORD lpdwRevision) -{ FIXME("(%p,%p,%p),stub!\n",pSecurityDescriptor,pControl,lpdwRevision); - return 1; +{ + CallWin32ToNt (RtlGetControlSecurityDescriptor(pSecurityDescriptor,pControl,lpdwRevision)); } /* ############################## + ###### ACL FUNCTIONS ###### + ############################## +*/ + +/************************************************************************* + * InitializeAcl [ADVAPI32.111] + */ +DWORD WINAPI InitializeAcl(PACL acl, DWORD size, DWORD rev) +{ + CallWin32ToNt (RtlCreateAcl(acl, size, rev)); +} + +/* ############################## ###### MISC FUNCTIONS ###### ############################## */ @@ -536,7 +495,7 @@ LookupPrivilegeValueW( LPCWSTR lpSystemName, LPCWSTR lpName, LPVOID lpLuid ) { FIXME("(%s,%s,%p): stub\n",debugstr_w(lpSystemName), - debugstr_w(lpName), lpLuid); + debugstr_w(lpName), lpLuid); return TRUE; } @@ -548,7 +507,9 @@ { LPWSTR lpSystemNameW = HEAP_strdupAtoW(GetProcessHeap(), 0, lpSystemName); LPWSTR lpNameW = HEAP_strdupAtoW(GetProcessHeap(), 0, lpName); - BOOL ret = LookupPrivilegeValueW( lpSystemNameW, lpNameW, lpLuid); + BOOL ret; + + ret = LookupPrivilegeValueW( lpSystemNameW, lpNameW, lpLuid); HeapFree(GetProcessHeap(), 0, lpNameW); HeapFree(GetProcessHeap(), 0, lpSystemNameW); return ret; @@ -600,14 +561,33 @@ * LookupAccountSid32A [ADVAPI32.86] */ BOOL WINAPI -LookupAccountSidA( LPCSTR system, PSID sid, LPCSTR account, - LPDWORD accountSize, LPCSTR domain, LPDWORD domainSize, - PSID_NAME_USE name_use ) +LookupAccountSidA( + IN LPCSTR system, + IN PSID sid, + OUT LPSTR account, + IN OUT LPDWORD accountSize, + OUT LPSTR domain, + IN OUT LPDWORD domainSize, + OUT PSID_NAME_USE name_use ) { - FIXME_(security)("(%s,%p,%p,%p,%p,%p,%p): stub\n", - system,sid,account,accountSize,domain,domainSize,name_use); - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return FALSE; + char * ac = "Administrator"; + char * dm = "DOMAIN"; + FIXME_(security)("(%s,sid=%p,%p,%p(%lu),%p,%p(%lu),%p): semi-stub\n", + debugstr_a(system),sid, + account,accountSize,accountSize?*accountSize:0, + domain,domainSize,domainSize?*domainSize:0, + name_use); + + if (accountSize) *accountSize = strlen(ac)+1; + if (account && (*accountSize > strlen(ac))) + strcpy(account, ac); + + if (domainSize) *domainSize = strlen(dm)+1; + if (domain && (*domainSize > strlen(dm))) + strcpy(domain,dm); + + if (name_use) *name_use = SidTypeUser; + return TRUE; } /****************************************************************************** @@ -623,14 +603,33 @@ * name_use [] */ BOOL WINAPI -LookupAccountSidW( LPCWSTR system, PSID sid, LPCWSTR account, - LPDWORD accountSize, LPCWSTR domain, LPDWORD domainSize, - PSID_NAME_USE name_use ) +LookupAccountSidW( + IN LPCWSTR system, + IN PSID sid, + OUT LPWSTR account, + IN OUT LPDWORD accountSize, + OUT LPWSTR domain, + IN OUT LPDWORD domainSize, + OUT PSID_NAME_USE name_use ) { - FIXME_(security)("(%p,%p,%p,%p,%p,%p,%p): stub\n", - system,sid,account,accountSize,domain,domainSize,name_use); - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return FALSE; + char * ac = "Administrator"; + char * dm = "DOMAIN"; + FIXME_(security)("(%s,sid=%p,%p,%p(%lu),%p,%p(%lu),%p): semi-stub\n", + debugstr_w(system),sid, + account,accountSize,accountSize?*accountSize:0, + domain,domainSize,domainSize?*domainSize:0, + name_use); + + if (accountSize) *accountSize = strlen(ac)+1; + if (account && (*accountSize > strlen(ac))) + lstrcpyAtoW(account, ac); + + if (domainSize) *domainSize = strlen(dm)+1; + if (domain && (*domainSize > strlen(dm))) + lstrcpyAtoW(domain,dm); + + if (name_use) *name_use = SidTypeUser; + return TRUE; } /****************************************************************************** @@ -703,37 +702,121 @@ * x4 [] */ NTSTATUS WINAPI -LsaOpenPolicy(PLSA_UNICODE_STRING SystemName, - PLSA_OBJECT_ATTRIBUTES ObjectAttributes, - ACCESS_MASK DesiredAccess, - PLSA_HANDLE PolicyHandle) +LsaOpenPolicy( + IN PLSA_UNICODE_STRING SystemName, + IN PLSA_OBJECT_ATTRIBUTES ObjectAttributes, + IN ACCESS_MASK DesiredAccess, + IN OUT PLSA_HANDLE PolicyHandle) { - FIXME("(%p,%p,0x%08lx,%p):stub\n", - SystemName, ObjectAttributes, DesiredAccess, PolicyHandle); - return 0xc0000000; /* generic error */ + FIXME("(%s,%p,0x%08lx,%p):stub\n", + SystemName?debugstr_w(SystemName->Buffer):"null", + ObjectAttributes, DesiredAccess, PolicyHandle); + dumpLsaAttributes(ObjectAttributes); + if(PolicyHandle) *PolicyHandle = (LSA_HANDLE)0xcafe; + return TRUE; } /****************************************************************************** * LsaQueryInformationPolicy [ADVAPI32.242] */ NTSTATUS WINAPI -LsaQueryInformationPolicy( IN LSA_HANDLE PolicyHandle, - IN POLICY_INFORMATION_CLASS InformationClass, - OUT PVOID *Buffer) +LsaQueryInformationPolicy( + IN LSA_HANDLE PolicyHandle, + IN POLICY_INFORMATION_CLASS InformationClass, + OUT PVOID *Buffer) { FIXME("(%p,0x%08x,%p):stub\n", PolicyHandle, InformationClass, Buffer); - return 0xc0000000; /* generic error */ + + if(!Buffer) return FALSE; + switch (InformationClass) + { + case PolicyAuditEventsInformation: /* 2 */ + { + PPOLICY_AUDIT_EVENTS_INFO p = HeapAlloc(SystemHeap, HEAP_ZERO_MEMORY, sizeof(POLICY_AUDIT_EVENTS_INFO)); + p->AuditingMode = FALSE; /* no auditing */ + *Buffer = p; + } + break; + case PolicyPrimaryDomainInformation: /* 3 */ + case PolicyAccountDomainInformation: /* 5 */ + { + struct di + { POLICY_PRIMARY_DOMAIN_INFO ppdi; + SID sid; + }; + SID_IDENTIFIER_AUTHORITY localSidAuthority = {SECURITY_NT_AUTHORITY}; + + struct di * xdi = HeapAlloc(SystemHeap, HEAP_ZERO_MEMORY, sizeof(xdi)); + RtlInitUnicodeString(&(xdi->ppdi.Name), HEAP_strdupAtoW(GetProcessHeap(),0,"DOMAIN")); + xdi->ppdi.Sid = &(xdi->sid); + xdi->sid.Revision = SID_REVISION; + xdi->sid.SubAuthorityCount = 1; + xdi->sid.IdentifierAuthority = localSidAuthority; + xdi->sid.SubAuthority[0] = SECURITY_LOCAL_SYSTEM_RID; + *Buffer = xdi; + } + break; + case PolicyAuditLogInformation: + case PolicyPdAccountInformation: + case PolicyLsaServerRoleInformation: + case PolicyReplicaSourceInformation: + case PolicyDefaultQuotaInformation: + case PolicyModificationInformation: + case PolicyAuditFullSetInformation: + case PolicyAuditFullQueryInformation: + case PolicyDnsDomainInformation: + { + FIXME("category not implemented\n"); + return FALSE; + } + } + return TRUE; } /****************************************************************************** + * LsaLookupSids [ADVAPI32.240] + */ +typedef struct +{ + SID_NAME_USE Use; + LSA_UNICODE_STRING Name; + LONG DomainIndex; +} LSA_TRANSLATED_NAME, *PLSA_TRANSLATED_NAME; + +typedef struct +{ + LSA_UNICODE_STRING Name; + PSID Sid; +} LSA_TRUST_INFORMATION, *PLSA_TRUST_INFORMATION; + +typedef struct +{ + ULONG Entries; + PLSA_TRUST_INFORMATION Domains; +} LSA_REFERENCED_DOMAIN_LIST, *PLSA_REFERENCED_DOMAIN_LIST; + +NTSTATUS WINAPI +LsaLookupSids( + IN LSA_HANDLE PolicyHandle, + IN ULONG Count, + IN PSID *Sids, + OUT PLSA_REFERENCED_DOMAIN_LIST *ReferencedDomains, + OUT PLSA_TRANSLATED_NAME *Names ) +{ + FIXME("%p %lu %p %p %p\n", + PolicyHandle, Count, Sids, ReferencedDomains, Names); + return FALSE; +} + +/****************************************************************************** * LsaFreeMemory [ADVAPI32.241] */ NTSTATUS WINAPI LsaFreeMemory(IN PVOID Buffer) { - FIXME("(%p):stub\n",Buffer); - return 0xc0000000; + TRACE("(%p)\n",Buffer); + return HeapFree(SystemHeap, 0, Buffer); } /****************************************************************************** * LsaClose [ADVAPI32.243] @@ -776,44 +859,37 @@ BOOL WINAPI ImpersonateSelf(SECURITY_IMPERSONATION_LEVEL ImpersonationLevel) { - FIXME("(%08x), stub\n", ImpersonationLevel); - return TRUE; + return RtlImpersonateSelf(ImpersonationLevel); } /****************************************************************************** * AccessCheck32 [ADVAPI32.71] + * + * FIXME check cast LPBOOL to PBOOLEAN */ BOOL WINAPI -AccessCheck(PSECURITY_DESCRIPTOR pSecurityDescriptor, HANDLE ClientToken, - DWORD DesiredAccess, PGENERIC_MAPPING GenericMapping, PPRIVILEGE_SET PrivilegeSet, - LPDWORD PrivilegeSetLength, LPDWORD GrantedAccess, LPBOOL AccessStatus) +AccessCheck( + PSECURITY_DESCRIPTOR SecurityDescriptor, + HANDLE ClientToken, + DWORD DesiredAccess, + PGENERIC_MAPPING GenericMapping, + PPRIVILEGE_SET PrivilegeSet, + LPDWORD PrivilegeSetLength, + LPDWORD GrantedAccess, + LPBOOL AccessStatus) { - FIXME("(%p, %04x, %08lx, %p, %p, %p, %p, %p), stub\n", - pSecurityDescriptor, ClientToken, DesiredAccess, GenericMapping, - PrivilegeSet, PrivilegeSetLength, GrantedAccess, AccessStatus); - *AccessStatus = TRUE; - return TRUE; + CallWin32ToNt (NtAccessCheck(SecurityDescriptor, ClientToken, DesiredAccess, + GenericMapping, PrivilegeSet, PrivilegeSetLength, GrantedAccess, (PBOOLEAN)AccessStatus)); } /************************************************************************* - * SetThreadToken [ADVAPI32.231] - * - * Assigns an "impersonation token" to a thread so it can assume the - * security privledges of another thread or process. Can also remove - * a previously assigned token. Only supported on NT - it's a stub - * exactly like this one on Win9X. - * + * SetKernelObjectSecurity [ADVAPI32.223] */ - -BOOL WINAPI SetThreadToken(PHANDLE thread, HANDLE token) +BOOL WINAPI SetKernelObjectSecurity ( + IN HANDLE Handle, + IN SECURITY_INFORMATION SecurityInformation, + IN PSECURITY_DESCRIPTOR SecurityDescriptor ) { - FIXME("(%p, %x): stub\n", thread, token); - - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - - return FALSE; + CallWin32ToNt (NtSetSecurityObject (Handle, SecurityInformation, SecurityDescriptor)); } - - -
diff --git a/dlls/ntdll/Makefile.in b/dlls/ntdll/Makefile.in index f645687..e153b42 100644 --- a/dlls/ntdll/Makefile.in +++ b/dlls/ntdll/Makefile.in
@@ -10,6 +10,7 @@ C_SRCS = \ exception.c \ file.c \ + misc.c \ nt.c \ om.c \ reg.c \
diff --git a/dlls/ntdll/file.c b/dlls/ntdll/file.c index 44a687c..5c5b992 100644 --- a/dlls/ntdll/file.c +++ b/dlls/ntdll/file.c
@@ -1,6 +1,7 @@ #include <stdlib.h> #include <string.h> #include "debugtools.h" +#include "ntdll_misc.h" #include "ntddk.h" @@ -25,10 +26,10 @@ ULONG ShareAccess, ULONG OpenOptions) { - FIXME("(%p,0x%08lx,%p(%s),%p,0x%08lx,0x%08lx) stub\n", + FIXME("(%p,0x%08lx,%p,%p,0x%08lx,0x%08lx) stub\n", FileHandle, DesiredAccess, ObjectAttributes, - ObjectAttributes ? debugstr_w(ObjectAttributes->ObjectName->Buffer) : NULL, IoStatusBlock, ShareAccess, OpenOptions); + dump_ObjectAttributes (ObjectAttributes); return 0; } @@ -64,11 +65,11 @@ PVOID EaBuffer, ULONG EaLength) { - FIXME("(%p,0x%08lx,%p(%s),%p,%p,0x%08lx,0x%08lx,0x%08lx,0x%08lx,%p,0x%08lx) stub\n", + FIXME("(%p,0x%08lx,%p,%p,%p,0x%08lx,0x%08lx,0x%08lx,0x%08lx,%p,0x%08lx) stub\n", FileHandle,DesiredAccess,ObjectAttributes, - ObjectAttributes ? debugstr_w(ObjectAttributes->ObjectName->Buffer) : NULL, IoStatusBlock,AllocateSize,FileAttributes, ShareAccess,CreateDisposition,CreateOptions,EaBuffer,EaLength); + dump_ObjectAttributes (ObjectAttributes); return 0; } @@ -210,6 +211,21 @@ FIXME("(0x%08x 0x%08x %p %p %p %p 0x%08lx 0x%08x 0x%08x %p 0x%08x\n", FileHandle, Event, ApcRoutine, ApcContext, IoStatusBlock, FileInformation, Length, FileInformationClass, ReturnSingleEntry, - debugstr_w(FileName->Buffer),RestartScan); + debugstr_us(FileName),RestartScan); return 0; } + +/****************************************************************************** + * NtQueryVolumeInformationFile [NTDLL] + */ +NTSTATUS WINAPI NtQueryVolumeInformationFile ( + IN HANDLE FileHandle, + OUT PIO_STATUS_BLOCK IoStatusBlock, + OUT PVOID FSInformation, + IN ULONG Length, + IN FS_INFORMATION_CLASS FSInformationClass) +{ + TRACE("(0x%08x %p %p 0x%08lx 0x%08x) stub\n", + FileHandle, IoStatusBlock, FSInformation, Length, FSInformationClass); + return STATUS_SUCCESS; +}
diff --git a/dlls/ntdll/misc.c b/dlls/ntdll/misc.c new file mode 100644 index 0000000..6890c06 --- /dev/null +++ b/dlls/ntdll/misc.c
@@ -0,0 +1,55 @@ +/* + * Helper functions for ntdll + */ +#include <time.h> + +#include "config.h" + +#include "debugstr.h" +#include "debugtools.h" +#include "ntdll_misc.h" + +DEFAULT_DEBUG_CHANNEL(ntdll) + +void dump_ObjectAttributes (POBJECT_ATTRIBUTES oa) +{ + if (oa) + TRACE("%p:(name=%s, attr=0x%08lx, hRoot=0x%08x, sd=%p) \n", + oa, debugstr_us(oa->ObjectName), + oa->Attributes, oa->RootDirectory, oa->SecurityDescriptor); +} + +void dump_AnsiString(PANSI_STRING as, BOOLEAN showstring) +{ + if (as) + { + if (showstring) + TRACE("%p %p(%s) (%u %u)\n", as, as->Buffer, debugstr_as(as), as->Length, as->MaximumLength); + else + TRACE("%p %p(<OUT>) (%u %u)\n", as, as->Buffer, as->Length, as->MaximumLength); + } +} + +void dump_UnicodeString(PUNICODE_STRING us, BOOLEAN showstring) +{ + if (us) + { + if (showstring) + TRACE("%p %p(%s) (%u %u)\n", us, us->Buffer, debugstr_us(us), us->Length, us->MaximumLength); + else + TRACE("%p %p(<OUT>) (%u %u)\n", us, us->Buffer, us->Length, us->MaximumLength); + } +} + +LPSTR debugstr_as (PANSI_STRING us) +{ + if (!us) return NULL; + return debugstr_an(us->Buffer, us->Length); +} + +LPSTR debugstr_us (PUNICODE_STRING us) +{ + if (!us) return NULL; + return debugstr_wn(us->Buffer, us->Length); +} +
diff --git a/dlls/ntdll/nt.c b/dlls/ntdll/nt.c index 6f278a5..63fc4ec 100644 --- a/dlls/ntdll/nt.c +++ b/dlls/ntdll/nt.c
@@ -15,6 +15,7 @@ #include "debugtools.h" #include "ntddk.h" +#include "ntdll_misc.h" DEFAULT_DEBUG_CHANNEL(ntdll) @@ -31,10 +32,9 @@ IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, IN TIMER_TYPE TimerType) { - FIXME("(%p,0x%08lx,%p(%s),0x%08x) stub\n", - TimerHandle,DesiredAccess,ObjectAttributes, - ObjectAttributes ? debugstr_w(ObjectAttributes->ObjectName->Buffer) : NULL, - TimerType); + FIXME("(%p,0x%08lx,%p,0x%08x) stub\n", + TimerHandle,DesiredAccess,ObjectAttributes, TimerType); + dump_ObjectAttributes(ObjectAttributes); return 0; } /************************************************************************** @@ -192,8 +192,9 @@ OUT PHANDLE NewToken) { FIXME("(0x%08x,0x%08lx,%p,0x%08x,0x%08x,%p),stub!\n", - ExistingToken, DesiredAccess, ObjectAttributes, ImpersonationLevel, - TokenType, NewToken); + ExistingToken, DesiredAccess, ObjectAttributes, + ImpersonationLevel, TokenType, NewToken); + dump_ObjectAttributes(ObjectAttributes); return 0; } @@ -247,6 +248,11 @@ /****************************************************************************** * NtQueryInformationToken [NTDLL.156] * +* NOTES +* Buffer for TokenUser: +* 0x00 TOKEN_USER the PSID field points to the SID +* 0x08 SID +* */ NTSTATUS WINAPI NtQueryInformationToken( HANDLE token, @@ -263,7 +269,20 @@ *retlen = sizeof (TOKEN_GROUPS); break; case TokenUser: /* 1 */ - *retlen = sizeof (TOKEN_USER); + { + int len = sizeof (TOKEN_USER)+ sizeof(SID); + *retlen = len; + if ( len <= tokeninfolength) + if( tokeninfo ) + { + TOKEN_USER * tuser = tokeninfo; + PSID sid = (PSID) &((LPBYTE)tokeninfo)[sizeof(TOKEN_USER)]; + SID_IDENTIFIER_AUTHORITY localSidAuthority = {SECURITY_NT_AUTHORITY}; + RtlInitializeSid(sid, &localSidAuthority, 1); + *(RtlSubAuthoritySid(sid, 0)) = SECURITY_INTERACTIVE_RID; + tuser->User.Sid = sid; + } + } break; case TokenPrivileges: *retlen = sizeof (TOKEN_PRIVILEGES); @@ -308,10 +327,10 @@ IN ULONG AllocationAttributes, IN HANDLE FileHandle OPTIONAL) { - FIXME("(%p,0x%08lx,%p(%s),%p,0x%08lx,0x%08lx,0x%08x) stub\n", - SectionHandle,DesiredAccess,ObjectAttributes, - ObjectAttributes ? debugstr_w(ObjectAttributes->ObjectName->Buffer) : NULL, + FIXME("(%p,0x%08lx,%p,%p,0x%08lx,0x%08lx,0x%08x) stub\n", + SectionHandle,DesiredAccess, ObjectAttributes, MaximumSize,SectionPageProtection,AllocationAttributes,FileHandle); + dump_ObjectAttributes(ObjectAttributes); return 0; } @@ -323,9 +342,9 @@ ACCESS_MASK DesiredAccess, POBJECT_ATTRIBUTES ObjectAttributes) { - FIXME("(%p,0x%08lx,%p(%s)),stub!\n", - SectionHandle,DesiredAccess,ObjectAttributes, - ObjectAttributes ? debugstr_w(ObjectAttributes->ObjectName->Buffer) : NULL); + FIXME("(%p,0x%08lx,%p),stub!\n", + SectionHandle,DesiredAccess,ObjectAttributes); + dump_ObjectAttributes(ObjectAttributes); return 0; } @@ -549,6 +568,35 @@ } /****************************************************************************** + * _alldiv [NTDLL.937] + * + * + */ +long long WINAPI _alldiv(LARGE_INTEGER a, LARGE_INTEGER b) +{ +#if SIZEOF_LONG_LONG==8 + return (*(long long*)&a / *(long long*)&b); +#else + FIXME(ntdll,"stub\n"); + retrun 0; +#endif +} +/****************************************************************************** + * _allmul [NTDLL.938] + * + * + */ +long long WINAPI _allmul(LARGE_INTEGER a, LARGE_INTEGER b) +{ +#if SIZEOF_LONG_LONG==8 + return (*(long long*)&a * *(long long*)&b); +#else + FIXME(ntdll,"stub\n"); + retrun 0; +#endif +} + +/****************************************************************************** * NtPowerInformation [NTDLL] * */ @@ -557,3 +605,20 @@ FIXME("(0x%08lx,0x%08lx,0x%08lx,0x%08lx,0x%08lx),stub\n",x1,x2,x3,x4,x5); return 0; } + +/****************************************************************************** + * NtAllocateLocallyUniqueId + * + * FIXME: the server should do that + */ +NTSTATUS WINAPI NtAllocateLocallyUniqueId(PLUID Luid) +{ + static LUID luid; + + FIXME("%p (0x%08lx%08lx)\n", Luid, luid.DUMMYSTRUCTNAME.HighPart, luid.DUMMYSTRUCTNAME.LowPart); + + luid.QuadPart++; + + Luid->QuadPart = luid.QuadPart; + return STATUS_SUCCESS; +}
diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec index dac2506..58e013e 100644 --- a/dlls/ntdll/ntdll.spec +++ b/dlls/ntdll/ntdll.spec
@@ -57,19 +57,19 @@ @ stub NlsMbCodePageTag @ stub NlsMbOemCodePageTag @ stdcall NtAcceptConnectPort(long long long long long long) NtAcceptConnectPort -@ stub NtAccessCheck +@ stdcall NtAccessCheck(ptr long long ptr ptr ptr ptr ptr) NtAccessCheck @ stub NtAccessCheckAndAuditAlarm @ stub NtAdjustGroupsToken @ stdcall NtAdjustPrivilegesToken(long long long long long long) NtAdjustPrivilegesToken @ stub NtAlertResumeThread @ stub NtAlertThread -@ stub NtAllocateLocallyUniqueId +@ stdcall NtAllocateLocallyUniqueId(ptr) NtAllocateLocallyUniqueId @ stub NtAllocateUuids @ stub NtAllocateVirtualMemory @ stub NtCallbackReturn @ stub NtCancelIoFile @ stub NtCancelTimer -@ stub NtClearEvent +@ stdcall NtClearEvent(long) NtClearEvent @ stdcall NtClose(long) NtClose @ stub NtCloseObjectAuditAlarm @ stdcall NtCompleteConnectPort(long) NtCompleteConnectPort @@ -150,13 +150,13 @@ @ stub NtPrivilegeObjectAuditAlarm @ stub NtPrivilegedServiceAuditAlarm @ stub NtProtectVirtualMemory -@ stub NtPulseEvent +@ stdcall NtPulseEvent(long ptr) NtPulseEvent @ stub NtQueryAttributesFile @ stub NtQueryDefaultLocale @ stdcall NtQueryDirectoryFile(long long ptr ptr ptr ptr long long long ptr long)NtQueryDirectoryFile @ stdcall NtQueryDirectoryObject(long long long long long long long) NtQueryDirectoryObject @ stub NtQueryEaFile -@ stub NtQueryEvent +@ stdcall NtQueryEvent(long long ptr long ptr) NtQueryEvent @ stdcall NtQueryInformationFile(long long long long long) NtQueryInformationFile @ stub NtQueryInformationPort @ stdcall NtQueryInformationProcess(long long long long long) NtQueryInformationProcess @@ -179,7 +179,6 @@ @ stdcall NtQueryTimerResolution(long long long) NtQueryTimerResolution @ stdcall NtQueryValueKey(long long long long long long) NtQueryValueKey @ stub NtQueryVirtualMemory -@ stub NtQueryVolumeInformationFile @ stdcall NtRaiseException(ptr ptr long) NtRaiseException @ stub NtRaiseHardError @ stdcall NtReadFile(long long long long long long long long long) NtReadFile @@ -197,7 +196,7 @@ @ stub NtReplyWaitReplyPort @ stub NtRequestPort @ stdcall NtRequestWaitReplyPort(long long long) NtRequestWaitReplyPort -@ stub NtResetEvent +@ stdcall NtResetEvent(long ptr) NtResetEvent @ stdcall NtRestoreKey(long long long) NtRestoreKey @ stdcall NtResumeThread(long long) NtResumeThread @ stdcall NtSaveKey(long long) NtSaveKey @@ -221,7 +220,7 @@ @ stub NtSetLowEventPair @ stub NtSetLowWaitHighEventPair @ stub NtSetLowWaitHighThread -@ stub NtSetSecurityObject +@ stdcall NtSetSecurityObject(long long ptr) NtSetSecurityObject @ stub NtSetSystemEnvironmentValue @ stub NtSetSystemInformation @ stub NtSetSystemPowerState @@ -290,7 +289,7 @@ @ stub RtlCharToInteger @ stub RtlCheckRegistryKey @ stub RtlClearAllBits -@ stub RtlClearBits +@ stdcall RtlClearBits(long long long) RtlClearBits @ stub RtlCompactHeap @ stub RtlCompareMemory @ stub RtlCompareMemoryUlong @@ -356,7 +355,7 @@ @ stub RtlEqualComputerName @ stub RtlEqualDomainName @ stub RtlEqualLuid -@ stub RtlEqualPrefixSid +@ stdcall RtlEqualPrefixSid(ptr ptr) RtlEqualPrefixSid @ stdcall RtlEqualSid (long long) RtlEqualSid @ stub RtlEqualString @ stdcall RtlEqualUnicodeString(long long long) RtlEqualUnicodeString @@ -368,7 +367,7 @@ @ stub RtlExtendedMagicDivide @ stdcall RtlFillMemory(ptr long long) RtlFillMemory @ stub RtlFillMemoryUlong -@ stub RtlFindClearBits +@ stdcall RtlFindClearBits(long long long) RtlFindClearBits @ stub RtlFindClearBitsAndSet @ stub RtlFindLongestRunClear @ stub RtlFindLongestRunSet @@ -376,7 +375,7 @@ @ stub RtlFindSetBits @ stub RtlFindSetBitsAndClear @ stdcall RtlFirstFreeAce(ptr ptr) RtlFirstFreeAce -@ stdcall RtlFormatCurrentUserKeyPath(wstr) RtlFormatCurrentUserKeyPath +@ stdcall RtlFormatCurrentUserKeyPath(ptr) RtlFormatCurrentUserKeyPath @ stub RtlFormatMessage @ stdcall RtlFreeAnsiString(long) RtlFreeAnsiString @ stdcall RtlFreeHeap(long long long) RtlFreeHeap @@ -387,7 +386,7 @@ @ stdcall RtlGetAce(ptr long ptr) RtlGetAce @ stub RtlGetCallersAddress @ stub RtlGetCompressionWorkSpaceSize -@ stub RtlGetControlSecurityDescriptor +@ stdcall RtlGetControlSecurityDescriptor(ptr ptr ptr) RtlGetControlSecurityDescriptor @ stub RtlGetCurrentDirectory_U @ stdcall RtlGetDaclSecurityDescriptor(ptr ptr ptr ptr) RtlGetDaclSecurityDescriptor @ stub RtlGetElementGenericTable @@ -400,19 +399,19 @@ @ stub RtlGetProcessHeaps @ stdcall RtlGetSaclSecurityDescriptor(ptr ptr ptr ptr)RtlGetSaclSecurityDescriptor @ stub RtlGetUserInfoHeap -@ stub RtlIdentifierAuthoritySid +@ stdcall RtlIdentifierAuthoritySid(ptr) RtlIdentifierAuthoritySid @ stub RtlImageDirectoryEntryToData @ stdcall RtlImageNtHeader(long) RtlImageNtHeader -@ stub RtlImpersonateSelf +@ stdcall RtlImpersonateSelf(long) RtlImpersonateSelf @ stdcall RtlInitAnsiString(ptr str) RtlInitAnsiString @ stub RtlInitCodePageTable @ stub RtlInitNlsTables @ stdcall RtlInitString(ptr str) RtlInitString @ stdcall RtlInitUnicodeString(ptr wstr) RtlInitUnicodeString -@ stub RtlInitializeBitMap +@ stdcall RtlInitializeBitMap(long long long) RtlInitializeBitMap @ stub RtlInitializeContext @ stdcall RtlInitializeCriticalSection(ptr) InitializeCriticalSection -@ stub RtlInitializeGenericTable +@ stdcall RtlInitializeGenericTable() RtlInitializeGenericTable @ stub RtlInitializeRXact @ stdcall RtlInitializeResource(ptr) RtlInitializeResource @ stdcall RtlInitializeSid(ptr ptr long) RtlInitializeSid @@ -438,7 +437,7 @@ @ stub RtlLocalTimeToSystemTime @ stub RtlLockHeap @ stub RtlLookupElementGenericTable -@ stub RtlMakeSelfRelativeSD +@ stdcall RtlMakeSelfRelativeSD(ptr ptr ptr) RtlMakeSelfRelativeSD @ stub RtlMapGenericMask @ stdcall RtlMoveMemory(ptr ptr long) RtlMoveMemory @ stdcall RtlMultiByteToUnicodeN(ptr long ptr ptr long) RtlMultiByteToUnicodeN @@ -457,7 +456,7 @@ @ stdcall RtlOpenCurrentUser(long ptr) RtlOpenCurrentUser @ stub RtlPcToFileHeader @ stub RtlPrefixString -@ stub RtlPrefixUnicodeString +@ stdcall RtlPrefixUnicodeString(ptr ptr long) RtlPrefixUnicodeString @ stub RtlProtectHeap @ stdcall RtlQueryEnvironmentVariable_U(long long long) RtlQueryEnvironmentVariable_U @ stub RtlQueryInformationAcl @@ -485,7 +484,7 @@ @ stub RtlSecondsSince1980ToTime @ stub RtlSelfRelativeToAbsoluteSD @ stub RtlSetAllBits -@ stub RtlSetBits +@ stdcall RtlSetBits(long long long) RtlSetBits @ stub RtlSetCurrentDirectory_U @ stub RtlSetCurrentEnvironment @ stdcall RtlSetDaclSecurityDescriptor(ptr long ptr long) RtlSetDaclSecurityDescriptor @@ -518,7 +517,7 @@ @ stub RtlUnicodeStringToOemSize @ stdcall RtlUnicodeStringToOemString(ptr ptr long) RtlUnicodeStringToOemString @ stub RtlUnicodeToCustomCPN -@ stub RtlUnicodeToMultiByteN +@ stdcall RtlUnicodeToMultiByteN(ptr long ptr ptr long) RtlUnicodeToMultiByteN @ stub RtlUnicodeToMultiByteSize @ stdcall RtlUnicodeToOemN(ptr long ptr ptr long) RtlUnicodeToOemN @ stub RtlUniform @@ -528,16 +527,16 @@ @ stdcall RtlUpcaseUnicodeString(ptr ptr long) RtlUpcaseUnicodeString @ stub RtlUpcaseUnicodeStringToAnsiString @ stub RtlUpcaseUnicodeStringToCountedOemString -@ stub RtlUpcaseUnicodeStringToOemString +@ stdcall RtlUpcaseUnicodeStringToOemString(ptr ptr long) RtlUpcaseUnicodeStringToOemString @ stub RtlUpcaseUnicodeToCustomCPN @ stub RtlUpcaseUnicodeToMultiByteN -@ stub RtlUpcaseUnicodeToOemN +@ stdcall RtlUpcaseUnicodeToOemN(ptr long ptr ptr long) RtlUpcaseUnicodeToOemN @ stub RtlUpperChar @ stub RtlUpperString @ stub RtlUsageHeap @ stub RtlValidAcl @ stdcall RtlValidSecurityDescriptor(ptr) RtlValidSecurityDescriptor -@ stub RtlValidSid +@ stdcall RtlValidSid(ptr) RtlValidSid @ stub RtlValidateHeap @ stub RtlValidateProcessHeaps @ stub RtlWalkHeap @@ -556,7 +555,7 @@ @ stdcall RtlxAnsiStringToUnicodeSize(ptr) RtlxAnsiStringToUnicodeSize @ stdcall RtlxOemStringToUnicodeSize(ptr) RtlxOemStringToUnicodeSize @ stub RtlxUnicodeStringToAnsiSize -@ stub RtlxUnicodeStringToOemSize +@ stdcall RtlxUnicodeStringToOemSize(ptr) RtlxUnicodeStringToOemSize @ stub SaveEm87Context @ stdcall ZwAcceptConnectPort(long long long long long long) NtAcceptConnectPort @ stub ZwAccessCheck @@ -956,8 +955,6 @@ @ cdecl wcstol(wstr ptr long) CRTDLL_wcstol @ cdecl wcstombs(ptr ptr long) CRTDLL_wcstombs @ stub wcstoul - -# NT 4 additions @ stub NtAddAtom @ stub NtDeleteAtom @ stub NtFindAtom
diff --git a/dlls/ntdll/ntdll_misc.h b/dlls/ntdll/ntdll_misc.h new file mode 100644 index 0000000..134aadf --- /dev/null +++ b/dlls/ntdll/ntdll_misc.h
@@ -0,0 +1,14 @@ +#ifndef __WINE_NTDLL_MISC_H +#define __WINE_NTDLL_MISC_H + +#include "ntdef.h" +#include "winnt.h" + +/* debug helper */ +extern LPSTR debugstr_as (PANSI_STRING us); +extern LPSTR debugstr_us (PUNICODE_STRING us); +extern void dump_ObjectAttributes (POBJECT_ATTRIBUTES ObjectAttributes); +extern void dump_AnsiString(PANSI_STRING as, BOOLEAN showstring); +extern void dump_UnicodeString(PUNICODE_STRING us, BOOLEAN showstring); + +#endif
diff --git a/dlls/ntdll/om.c b/dlls/ntdll/om.c index b85b801..81a0f02 100644 --- a/dlls/ntdll/om.c +++ b/dlls/ntdll/om.c
@@ -7,6 +7,7 @@ #include "debugtools.h" #include "ntddk.h" +#include "ntdll_misc.h" DEFAULT_DEBUG_CHANNEL(ntdll) @@ -34,11 +35,157 @@ /****************************************************************************** * NtQuerySecurityObject [NTDLL] + * + * analogue to GetKernelObjectSecurity + * + * NOTES + * only the lowest 4 bit of SecurityObjectInformationClass are used + * 0x7-0xf returns STATUS_ACCESS_DENIED (even running with system priviledges) + * + * FIXME: we are constructing a fake sid + * (Administrators:Full, System:Full, Everyone:Read) */ -NTSTATUS WINAPI NtQuerySecurityObject(DWORD x1,DWORD x2,DWORD x3,DWORD x4,DWORD x5) +NTSTATUS WINAPI +NtQuerySecurityObject( + IN HANDLE Object, + IN SECURITY_INFORMATION RequestedInformation, + OUT PSECURITY_DESCRIPTOR pSecurityDesriptor, + IN ULONG Length, + OUT PULONG ResultLength) { - FIXME("(0x%08lx,0x%08lx,0x%08lx,0x%08lx,0x%08lx) stub!\n",x1,x2,x3,x4,x5); - return 0; + static SID_IDENTIFIER_AUTHORITY localSidAuthority = {SECURITY_NT_AUTHORITY}; + static SID_IDENTIFIER_AUTHORITY worldSidAuthority = {SECURITY_WORLD_SID_AUTHORITY}; + BYTE Buffer[256]; + PISECURITY_DESCRIPTOR_RELATIVE psd = (PISECURITY_DESCRIPTOR_RELATIVE)Buffer; + UINT BufferIndex = sizeof(SECURITY_DESCRIPTOR_RELATIVE); + + FIXME("(0x%08x,0x%08lx,%p,0x%08lx,%p) stub!\n", + Object, RequestedInformation, pSecurityDesriptor, Length, ResultLength); + + RequestedInformation &= 0x0000000f; + + if (RequestedInformation & SACL_SECURITY_INFORMATION) return STATUS_ACCESS_DENIED; + + ZeroMemory(Buffer, 256); + RtlCreateSecurityDescriptor((PSECURITY_DESCRIPTOR)psd, SECURITY_DESCRIPTOR_REVISION); + psd->Control = SE_SELF_RELATIVE | + ((RequestedInformation & DACL_SECURITY_INFORMATION) ? SE_DACL_PRESENT:0); + + /* owner: administrator S-1-5-20-220*/ + if (OWNER_SECURITY_INFORMATION & RequestedInformation) + { + PSID psid = (PSID)&(Buffer[BufferIndex]); + + psd->Owner = BufferIndex; + BufferIndex += RtlLengthRequiredSid(2); + + psid->Revision = SID_REVISION; + psid->SubAuthorityCount = 2; + psid->IdentifierAuthority = localSidAuthority; + psid->SubAuthority[0] = SECURITY_BUILTIN_DOMAIN_RID; + psid->SubAuthority[1] = DOMAIN_ALIAS_RID_ADMINS; + } + + /* group: built in domain S-1-5-12 */ + if (GROUP_SECURITY_INFORMATION & RequestedInformation) + { + PSID psid = (PSID) &(Buffer[BufferIndex]); + + psd->Group = BufferIndex; + BufferIndex += RtlLengthRequiredSid(1); + + psid->Revision = SID_REVISION; + psid->SubAuthorityCount = 1; + psid->IdentifierAuthority = localSidAuthority; + psid->SubAuthority[0] = SECURITY_LOCAL_SYSTEM_RID; + } + + /* discretionary ACL */ + if (DACL_SECURITY_INFORMATION & RequestedInformation) + { + /* acl header */ + PACL pacl = (PACL)&(Buffer[BufferIndex]); + PACCESS_ALLOWED_ACE pace; + PSID psid; + + psd->Dacl = BufferIndex; + + pacl->AclRevision = MIN_ACL_REVISION; + pacl->AceCount = 3; + pacl->AclSize = BufferIndex; /* storing the start index temporary */ + + BufferIndex += sizeof(ACL); + + /* ACE System - full access */ + pace = (PACCESS_ALLOWED_ACE)&(Buffer[BufferIndex]); + BufferIndex += sizeof(ACCESS_ALLOWED_ACE)-sizeof(DWORD); + + pace->Header.AceType = ACCESS_ALLOWED_ACE_TYPE; + pace->Header.AceFlags = CONTAINER_INHERIT_ACE; + pace->Header.AceSize = sizeof(ACCESS_ALLOWED_ACE)-sizeof(DWORD) + RtlLengthRequiredSid(1); + pace->Mask = DELETE | READ_CONTROL | WRITE_DAC | WRITE_OWNER | 0x3f; + pace->SidStart = BufferIndex; + + /* SID S-1-5-12 (System) */ + psid = (PSID)&(Buffer[BufferIndex]); + + BufferIndex += RtlLengthRequiredSid(1); + + psid->Revision = SID_REVISION; + psid->SubAuthorityCount = 1; + psid->IdentifierAuthority = localSidAuthority; + psid->SubAuthority[0] = SECURITY_LOCAL_SYSTEM_RID; + + /* ACE Administrators - full access*/ + pace = (PACCESS_ALLOWED_ACE) &(Buffer[BufferIndex]); + BufferIndex += sizeof(ACCESS_ALLOWED_ACE)-sizeof(DWORD); + + pace->Header.AceType = ACCESS_ALLOWED_ACE_TYPE; + pace->Header.AceFlags = CONTAINER_INHERIT_ACE; + pace->Header.AceSize = sizeof(ACCESS_ALLOWED_ACE)-sizeof(DWORD) + RtlLengthRequiredSid(2); + pace->Mask = DELETE | READ_CONTROL | WRITE_DAC | WRITE_OWNER | 0x3f; + pace->SidStart = BufferIndex; + + /* S-1-5-12 (Administrators) */ + psid = (PSID)&(Buffer[BufferIndex]); + + BufferIndex += RtlLengthRequiredSid(2); + + psid->Revision = SID_REVISION; + psid->SubAuthorityCount = 2; + psid->IdentifierAuthority = localSidAuthority; + psid->SubAuthority[0] = SECURITY_BUILTIN_DOMAIN_RID; + psid->SubAuthority[1] = DOMAIN_ALIAS_RID_ADMINS; + + /* ACE Everyone - read access */ + pace = (PACCESS_ALLOWED_ACE)&(Buffer[BufferIndex]); + BufferIndex += sizeof(ACCESS_ALLOWED_ACE)-sizeof(DWORD); + + pace->Header.AceType = ACCESS_ALLOWED_ACE_TYPE; + pace->Header.AceFlags = CONTAINER_INHERIT_ACE; + pace->Header.AceSize = sizeof(ACCESS_ALLOWED_ACE)-sizeof(DWORD) + RtlLengthRequiredSid(1); + pace->Mask = READ_CONTROL| 0x19; + pace->SidStart = BufferIndex; + + /* SID S-1-1-0 (Everyone) */ + psid = (PSID)&(Buffer[BufferIndex]); + + BufferIndex += RtlLengthRequiredSid(1); + + psid->Revision = SID_REVISION; + psid->SubAuthorityCount = 1; + psid->IdentifierAuthority = worldSidAuthority; + psid->SubAuthority[0] = 0; + + /* calculate used bytes */ + pacl->AclSize = BufferIndex - pacl->AclSize; + } + *ResultLength = BufferIndex; + TRACE("len=%lu\n", *ResultLength); + if (Length < *ResultLength) return STATUS_BUFFER_TOO_SMALL; + memcpy(pSecurityDesriptor, Buffer, *ResultLength); + + return STATUS_SUCCESS; } /****************************************************************************** * NtDuplicateObject [NTDLL] @@ -68,8 +215,10 @@ NTSTATUS WINAPI NtClose( HANDLE Handle) { - FIXME("(0x%08x),stub!\n",Handle); - return 1; + TRACE("(0x%08x)\n",Handle); + if (CloseHandle(Handle)) + return STATUS_SUCCESS; + return STATUS_UNSUCCESSFUL; /*fixme*/ } /****************************************************************************** @@ -102,10 +251,10 @@ ACCESS_MASK DesiredAccess, POBJECT_ATTRIBUTES ObjectAttributes) { - FIXME("(%p,0x%08lx,%p(%s)): stub\n", - DirectoryHandle, DesiredAccess, ObjectAttributes, - ObjectAttributes ? debugstr_w(ObjectAttributes->ObjectName->Buffer) : NULL); - return 0; + FIXME("(%p,0x%08lx,%p): stub\n", + DirectoryHandle, DesiredAccess, ObjectAttributes); + dump_ObjectAttributes(ObjectAttributes); + return 0; } /****************************************************************************** @@ -116,9 +265,9 @@ ACCESS_MASK DesiredAccess, POBJECT_ATTRIBUTES ObjectAttributes) { - FIXME("(%p,0x%08lx,%p(%s)),stub!\n", - DirectoryHandle,DesiredAccess,ObjectAttributes, - ObjectAttributes ? debugstr_w(ObjectAttributes->ObjectName->Buffer) : NULL); + FIXME("(%p,0x%08lx,%p),stub!\n", + DirectoryHandle,DesiredAccess,ObjectAttributes); + dump_ObjectAttributes(ObjectAttributes); return 0; } @@ -162,9 +311,9 @@ IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes) { - FIXME("(%p,0x%08lx,%p(%s)) stub\n", - LinkHandle, DesiredAccess, ObjectAttributes, - ObjectAttributes ? debugstr_w(ObjectAttributes->ObjectName->Buffer) : NULL); + FIXME("(%p,0x%08lx,%p) stub\n", + LinkHandle, DesiredAccess, ObjectAttributes); + dump_ObjectAttributes(ObjectAttributes); return 0; } @@ -177,10 +326,9 @@ IN POBJECT_ATTRIBUTES ObjectAttributes, IN PUNICODE_STRING Name) { - FIXME("(%p,0x%08lx,%p(%s), %p) stub\n", - SymbolicLinkHandle, DesiredAccess, ObjectAttributes, - ObjectAttributes ? debugstr_w(ObjectAttributes->ObjectName->Buffer) : NULL, - debugstr_w(Name->Buffer)); + FIXME("(%p,0x%08lx,%p, %p) stub\n", + SymbolicLinkHandle, DesiredAccess, ObjectAttributes, debugstr_us(Name)); + dump_ObjectAttributes(ObjectAttributes); return 0; } @@ -193,7 +341,7 @@ OUT PULONG ReturnedLength OPTIONAL) { FIXME("(0x%08x,%p,%p) stub\n", - LinkHandle, debugstr_w(LinkTarget->Buffer), ReturnedLength); + LinkHandle, debugstr_us(LinkTarget), ReturnedLength); return 0; }
diff --git a/dlls/ntdll/reg.c b/dlls/ntdll/reg.c index ae86486..3aa6287 100644 --- a/dlls/ntdll/reg.c +++ b/dlls/ntdll/reg.c
@@ -1,15 +1,124 @@ /* * registry functions + * + * NOTES: + * HKEY_LOCAL_MACHINE \\REGISTRY\\MACHINE + * HKEY_USERS \\REGISTRY\\USER + * HKEY_CURRENT_CONFIG \\REGISTRY\\MACHINE\\SYSTEM\\CURRENTCONTROLSET\\HARDWARE PROFILES\\CURRENT + * HKEY_CLASSES \\REGISTRY\\MACHINE\\SOFTWARE\\CLASSES */ #include "debugtools.h" #include "winreg.h" - +#include "winerror.h" +#include "file.h" +#include "server.h" #include "ntddk.h" +#include "crtdll.h" +#include "ntdll_misc.h" DEFAULT_DEBUG_CHANNEL(ntdll) +/* helper to make the server functions return STATUS_ codes */ +static NTSTATUS ErrorCodeToStatus (DWORD Error) +{ + TRACE("err=%lu\n", Error); + switch (Error) + { + case NO_ERROR: return STATUS_SUCCESS; + + case ERROR_INSUFFICIENT_BUFFER: return STATUS_BUFFER_TOO_SMALL; + case ERROR_FILE_NOT_FOUND: return STATUS_OBJECT_NAME_NOT_FOUND; + case ERROR_NO_MORE_ITEMS: return STATUS_NO_MORE_ENTRIES; +/* + return STATUS_INVALID_PARAMETER; + return STATUS_INVALID_HANDLE + return STATUS_ACCESS_DENIED +*/ +/* case ERROR_MORE_DATA: return STATUS_BUFFER_OVERFLOW; + case ERROR_KEY_DELETED: return STATUS_KEY_DELETED; + case ERROR_CHILD_MUST_BE_VOLATILE: return STATUS_CHILD_MUST_BE_VOLATILE; + case ERROR_ACCESS_DENIED: return STATUS_ACCESS_DENIED; + case ERROR_NOT_REGISTRY_FILE: return STATUS_NOT_REGISTRY_FILE; +*/ + default: + FIXME("Error code %lu not implemented\n", Error); + } + return STATUS_UNSUCCESSFUL; +} + +#define nt_server_call(kind) (ret=ErrorCodeToStatus(server_call_noerr(kind))) + +/* copy a key name into the request buffer */ +static inline NTSTATUS copy_nameU( LPWSTR Dest, PUNICODE_STRING Name, UINT Offset ) +{ + if (Name->Buffer) + { + if ((Name->Length-Offset) > MAX_PATH) return STATUS_BUFFER_OVERFLOW; + lstrcpyW( Dest, Name->Buffer+Offset ); + } + else Dest[0] = 0; + return STATUS_SUCCESS; +} + +/* translates predefined paths to HKEY_ constants */ +static BOOLEAN _NtKeyToWinKey( + IN POBJECT_ATTRIBUTES ObjectAttributes, + OUT UINT * Offset, /* offset within ObjectName */ + OUT HKEY * KeyHandle) /* translated handle */ +{ + static const WCHAR KeyPath_HKLM[] = { + '\\','R','E','G','I','S','T','R','Y', + '\\','M','A','C','H','I','N','E',0}; + static const WCHAR KeyPath_HKU [] = { + '\\','R','E','G','I','S','T','R','Y', + '\\','U','S','E','R',0}; + static const WCHAR KeyPath_HCC [] = { + '\\','R','E','G','I','S','T','R','Y', + '\\','M','A','C','H','I','N','E', + '\\','S','Y','S','T','E','M', + '\\','C','U','R','R','E','N','T','C','O','N','T','R','O','L','S','E','T', + '\\','H','A','R','D','W','A','R','E','P','R','O','F','I','L','E','S', + '\\','C','U','R','R','E','N','T',0}; + static const WCHAR KeyPath_HCR [] = { + '\\','R','E','G','I','S','T','R','Y', + '\\','M','A','C','H','I','N','E', + '\\','S','O','F','T','W','A','R','E', + '\\','C','L','A','S','S','E','S',0}; + int len; + PUNICODE_STRING ObjectName = ObjectAttributes->ObjectName; + + if((ObjectName->Length > (len=lstrlenW(KeyPath_HKLM))) + && (0==CRTDLL_wcsncmp(ObjectName->Buffer,KeyPath_HKLM,len))) + { *KeyHandle = HKEY_LOCAL_MACHINE; + } + else if((ObjectName->Length > (len=lstrlenW(KeyPath_HKU))) + && (0==CRTDLL_wcsncmp(ObjectName->Buffer,KeyPath_HKU,len))) + { *KeyHandle = HKEY_USERS; + } + else if((ObjectName->Length > (len=lstrlenW(KeyPath_HCR))) + && (0==CRTDLL_wcsncmp(ObjectName->Buffer,KeyPath_HCR,len))) + { *KeyHandle = HKEY_CLASSES_ROOT; + } + else if((ObjectName->Length > (len=lstrlenW(KeyPath_HCC))) + && (0==CRTDLL_wcsncmp(ObjectName->Buffer,KeyPath_HCC,len))) + { *KeyHandle = HKEY_CURRENT_CONFIG; + } + else + { + *KeyHandle = ObjectAttributes->RootDirectory; + *Offset = 0; + return FALSE; + } + + if (ObjectName->Buffer[len] == (WCHAR)'\\') len++; + *Offset = len; + + TRACE("off=%u hkey=0x%08x\n", *Offset, *KeyHandle); + return TRUE; +} + /****************************************************************************** * NtCreateKey [NTDLL] * ZwCreateKey @@ -23,10 +132,81 @@ ULONG CreateOptions, PULONG Disposition) { - FIXME("(%p,0x%08lx,%p (%s),0x%08lx, %p(%s),0x%08lx,%p),stub!\n", - KeyHandle, DesiredAccess, ObjectAttributes,debugstr_w(ObjectAttributes->ObjectName->Buffer), - TitleIndex, Class, debugstr_w(Class->Buffer), CreateOptions, Disposition); - return 0; + struct create_key_request *req = get_req_buffer(); + UINT ObjectNameOffset; + HKEY RootDirectory; + NTSTATUS ret; + + TRACE("(%p,0x%08lx,0x%08lx,%p(%s),0x%08lx,%p)\n", + KeyHandle, DesiredAccess, TitleIndex, Class, debugstr_us(Class), CreateOptions, Disposition); + dump_ObjectAttributes(ObjectAttributes); + + if (!KeyHandle) + return STATUS_INVALID_PARAMETER; + + _NtKeyToWinKey(ObjectAttributes, &ObjectNameOffset, &RootDirectory); + + req->parent = RootDirectory; + req->access = DesiredAccess; + req->options = CreateOptions; + req->modif = time(NULL); + + if (copy_nameU( req->name, ObjectAttributes->ObjectName, ObjectNameOffset ) != STATUS_SUCCESS) + return STATUS_INVALID_PARAMETER; + + if (Class) + { + int ClassLen = Class->Length+1; + if ( ClassLen*sizeof(WCHAR) > server_remaining(req->class)) return STATUS_BUFFER_OVERFLOW; + lstrcpynW( req->class, Class->Buffer, ClassLen); + } + else + req->class[0] = 0x0000; + + if (nt_server_call(REQ_CREATE_KEY) == STATUS_SUCCESS) + { + *KeyHandle = req->hkey; + if (Disposition) *Disposition = req->created ? REG_CREATED_NEW_KEY : REG_OPENED_EXISTING_KEY; + } + return ret; +} + +/****************************************************************************** + * NtOpenKey [NTDLL.129] + * ZwOpenKey + * OUT PHANDLE KeyHandle (returns 0 when failure) + * IN ACCESS_MASK DesiredAccess + * IN POBJECT_ATTRIBUTES ObjectAttributes + */ +NTSTATUS WINAPI NtOpenKey( + PHANDLE KeyHandle, + ACCESS_MASK DesiredAccess, + POBJECT_ATTRIBUTES ObjectAttributes) +{ + struct open_key_request *req = get_req_buffer(); + UINT ObjectNameOffset; + HKEY RootDirectory; + NTSTATUS ret; + + TRACE("(%p,0x%08lx)\n", KeyHandle, DesiredAccess); + dump_ObjectAttributes(ObjectAttributes); + + if (!KeyHandle) return STATUS_INVALID_PARAMETER; + *KeyHandle = 0; + + _NtKeyToWinKey(ObjectAttributes, &ObjectNameOffset, &RootDirectory); + + req->parent = RootDirectory; + req->access = DesiredAccess; + + if (copy_nameU( req->name, ObjectAttributes->ObjectName, ObjectNameOffset ) != STATUS_SUCCESS) + return STATUS_INVALID_PARAMETER; + + if (nt_server_call(REQ_OPEN_KEY) == STATUS_SUCCESS) + { + *KeyHandle = req->hkey; + } + return ret; } /****************************************************************************** @@ -37,7 +217,7 @@ { FIXME("(0x%08x) stub!\n", KeyHandle); - return 1; + return STATUS_SUCCESS; } /****************************************************************************** @@ -49,13 +229,16 @@ IN PUNICODE_STRING ValueName) { FIXME("(0x%08x,%p(%s)) stub!\n", - KeyHandle, ValueName,debugstr_w(ValueName->Buffer)); - return 1; - + KeyHandle, ValueName,debugstr_us(ValueName)); + return STATUS_SUCCESS; } + /****************************************************************************** * NtEnumerateKey [NTDLL] * ZwEnumerateKey + * + * NOTES + * the name copied into the buffer is NOT 0-terminated */ NTSTATUS WINAPI NtEnumerateKey( HANDLE KeyHandle, @@ -65,9 +248,156 @@ ULONG Length, PULONG ResultLength) { - FIXME("(0x%08x,0x%08lx,0x%08x,%p,0x%08lx,%p) stub\n", + struct enum_key_request *req = get_req_buffer(); + NTSTATUS ret; + + TRACE("(0x%08x,0x%08lx,0x%08x,%p,0x%08lx,%p)\n", KeyHandle, Index, KeyInformationClass, KeyInformation, Length, ResultLength); - return 1; + + req->hkey = KeyHandle; + req->index = Index; + if (nt_server_call(REQ_ENUM_KEY) != STATUS_SUCCESS) return ret; + + switch (KeyInformationClass) + { + case KeyBasicInformation: + { + PKEY_BASIC_INFORMATION kbi = KeyInformation; + UINT NameLength = lstrlenW(req->name) * sizeof(WCHAR); + *ResultLength = sizeof(KEY_BASIC_INFORMATION) - sizeof(WCHAR) + NameLength; + if (Length < *ResultLength) return STATUS_BUFFER_OVERFLOW; + + DOSFS_UnixTimeToFileTime(req->modif, &kbi->LastWriteTime, 0); + kbi->TitleIndex = 0; + kbi->NameLength = NameLength; + memcpy (kbi->Name, req->name, NameLength); + } + break; + case KeyFullInformation: + { + PKEY_FULL_INFORMATION kfi = KeyInformation; + kfi->ClassLength = lstrlenW(req->class) * sizeof(WCHAR); + kfi->ClassOffset = (kfi->ClassLength) ? + sizeof(KEY_FULL_INFORMATION) - sizeof(WCHAR) : 0xffffffff; + *ResultLength = sizeof(KEY_FULL_INFORMATION) - sizeof(WCHAR) + kfi->ClassLength; + if (Length < *ResultLength) return STATUS_BUFFER_OVERFLOW; + + DOSFS_UnixTimeToFileTime(req->modif, &kfi->LastWriteTime, 0); + kfi->TitleIndex = 0; +/* kfi->SubKeys = req->subkeys; + kfi->MaxNameLength = req->max_subkey; + kfi->MaxClassLength = req->max_class; + kfi->Values = req->values; + kfi->MaxValueNameLen = req->max_value; + kfi->MaxValueDataLen = req->max_data; +*/ + FIXME("incomplete\n"); + if (kfi->ClassLength) memcpy (kfi->Class, req->class, kfi->ClassLength); + } + break; + case KeyNodeInformation: + { + PKEY_NODE_INFORMATION kni = KeyInformation; + kni->ClassLength = lstrlenW(req->class) * sizeof(WCHAR); + kni->NameLength = lstrlenW(req->name) * sizeof(WCHAR); + kni->ClassOffset = (kni->ClassLength) ? + sizeof(KEY_NODE_INFORMATION) - sizeof(WCHAR) + kni->NameLength : 0xffffffff; + + *ResultLength = sizeof(KEY_NODE_INFORMATION) - sizeof(WCHAR) + kni->NameLength + kni->ClassLength; + if (Length < *ResultLength) return STATUS_BUFFER_OVERFLOW; + + DOSFS_UnixTimeToFileTime(req->modif, &kni->LastWriteTime, 0); + kni->TitleIndex = 0; + memcpy (kni->Name, req->name, kni->NameLength); + if (kni->ClassLength) memcpy (KeyInformation+kni->ClassOffset, req->class, kni->ClassLength); + } + break; + default: + FIXME("KeyInformationClass not implemented\n"); + return STATUS_UNSUCCESSFUL; + } + TRACE("buf=%lu len=%lu\n", Length, *ResultLength); + return ret; +} + +/****************************************************************************** + * NtQueryKey [NTDLL] + * ZwQueryKey + */ +NTSTATUS WINAPI NtQueryKey( + HANDLE KeyHandle, + KEY_INFORMATION_CLASS KeyInformationClass, + PVOID KeyInformation, + ULONG Length, + PULONG ResultLength) +{ + struct query_key_info_request *req = get_req_buffer(); + NTSTATUS ret; + + TRACE("(0x%08x,0x%08x,%p,0x%08lx,%p) stub\n", + KeyHandle, KeyInformationClass, KeyInformation, Length, ResultLength); + + req->hkey = KeyHandle; + if ((ret=nt_server_call(REQ_QUERY_KEY_INFO)) != STATUS_SUCCESS) return ret; + + switch (KeyInformationClass) + { + case KeyBasicInformation: + { + PKEY_BASIC_INFORMATION kbi = KeyInformation; + UINT NameLength = lstrlenW(req->name) * sizeof(WCHAR); + *ResultLength = sizeof(KEY_BASIC_INFORMATION) - sizeof(WCHAR) + NameLength; + if (Length < *ResultLength) return STATUS_BUFFER_OVERFLOW; + + DOSFS_UnixTimeToFileTime(req->modif, &kbi->LastWriteTime, 0); + kbi->TitleIndex = 0; + kbi->NameLength = NameLength; + memcpy (kbi->Name, req->name, NameLength); + } + break; + case KeyFullInformation: + { + PKEY_FULL_INFORMATION kfi = KeyInformation; + kfi->ClassLength = lstrlenW(req->class) * sizeof(WCHAR); + kfi->ClassOffset = (kfi->ClassLength) ? + sizeof(KEY_FULL_INFORMATION) - sizeof(WCHAR) : 0xffffffff; + + *ResultLength = sizeof(KEY_FULL_INFORMATION) - sizeof(WCHAR) + kfi->ClassLength; + if (Length < *ResultLength) return STATUS_BUFFER_OVERFLOW; + + DOSFS_UnixTimeToFileTime(req->modif, &kfi->LastWriteTime, 0); + kfi->TitleIndex = 0; + kfi->SubKeys = req->subkeys; + kfi->MaxNameLen = req->max_subkey; + kfi->MaxClassLen = req->max_class; + kfi->Values = req->values; + kfi->MaxValueNameLen = req->max_value; + kfi->MaxValueDataLen = req->max_data; + if(kfi->ClassLength) memcpy (KeyInformation+kfi->ClassOffset, req->class, kfi->ClassLength); + } + break; + case KeyNodeInformation: + { + PKEY_NODE_INFORMATION kni = KeyInformation; + kni->ClassLength = lstrlenW(req->class) * sizeof(WCHAR); + kni->NameLength = lstrlenW(req->name) * sizeof(WCHAR); + kni->ClassOffset = (kni->ClassLength) ? + sizeof(KEY_NODE_INFORMATION) - sizeof(WCHAR) + kni->NameLength : 0xffffffff; + + *ResultLength = sizeof(KEY_NODE_INFORMATION) - sizeof(WCHAR) + kni->NameLength + kni->ClassLength; + if (Length < *ResultLength) return STATUS_BUFFER_OVERFLOW; + + DOSFS_UnixTimeToFileTime(req->modif, &kni->LastWriteTime, 0); + kni->TitleIndex = 0; + memcpy (kni->Name, req->name, kni->NameLength); + if(kni->ClassLength) memcpy (KeyInformation+kni->ClassOffset, req->class, kni->ClassLength); + } + break; + default: + FIXME("KeyInformationClass not implemented\n"); + return STATUS_UNSUCCESSFUL; + } + return ret; } /****************************************************************************** @@ -82,9 +412,71 @@ ULONG Length, PULONG ResultLength) { - FIXME("(0x%08x,0x%08lx,0x%08x,%p,0x%08lx,%p) stub!\n", + struct enum_key_value_request *req = get_req_buffer(); + UINT NameLength; + NTSTATUS ret; + + TRACE("(0x%08x,0x%08lx,0x%08x,%p,0x%08lx,%p)\n", KeyHandle, Index, KeyInformationClass, KeyInformation, Length, ResultLength); - return 1; + + req->hkey = KeyHandle; + req->index = Index; + if (nt_server_call(REQ_ENUM_KEY_VALUE) != STATUS_SUCCESS) return ret; + + switch (KeyInformationClass) + { + case KeyBasicInformation: + { + PKEY_VALUE_BASIC_INFORMATION kbi = KeyInformation; + + NameLength = lstrlenW(req->name) * sizeof(WCHAR); + *ResultLength = sizeof(KEY_VALUE_BASIC_INFORMATION) - sizeof(WCHAR) + NameLength; + if (*ResultLength > Length) return STATUS_BUFFER_TOO_SMALL; + + kbi->TitleIndex = 0; + kbi->Type = req->type; + kbi->NameLength = NameLength; + memcpy(kbi->Name, req->name, kbi->NameLength); + } + break; + case KeyValueFullInformation: + { + PKEY_VALUE_FULL_INFORMATION kbi = KeyInformation; + UINT DataOffset; + + NameLength = lstrlenW(req->name) * sizeof(WCHAR); + DataOffset = sizeof(KEY_VALUE_FULL_INFORMATION) - sizeof(WCHAR) + NameLength; + *ResultLength = DataOffset + req->len; + + if (*ResultLength > Length) return STATUS_BUFFER_TOO_SMALL; + + kbi->TitleIndex = 0; + kbi->Type = req->type; + kbi->DataOffset = DataOffset; + kbi->DataLength = req->len; + kbi->NameLength = NameLength; + memcpy(kbi->Name, req->name, kbi->NameLength); + memcpy(((LPBYTE)kbi) + DataOffset, req->data, req->len); + } + break; + case KeyValuePartialInformation: + { + PKEY_VALUE_PARTIAL_INFORMATION kbi = KeyInformation; + + *ResultLength = sizeof(KEY_VALUE_PARTIAL_INFORMATION) - sizeof(WCHAR) + req->len; + + if (*ResultLength > Length) return STATUS_BUFFER_TOO_SMALL; + + kbi->TitleIndex = 0; + kbi->Type = req->type; + kbi->DataLength = req->len; + memcpy(kbi->Data, req->data, req->len); + } + break; + default: + FIXME("not implemented\n"); + } + return STATUS_SUCCESS; } /****************************************************************************** @@ -106,10 +498,9 @@ PHANDLE KeyHandle, POBJECT_ATTRIBUTES ObjectAttributes) { - FIXME("(%p,%p (%s)),stub!\n", - KeyHandle, ObjectAttributes,debugstr_w(ObjectAttributes->ObjectName->Buffer)); - return 0; - + FIXME("(%p),stub!\n", KeyHandle); + dump_ObjectAttributes(ObjectAttributes); + return STATUS_SUCCESS; } /****************************************************************************** @@ -131,41 +522,7 @@ FIXME("(0x%08x,0x%08x,%p,%p,%p,0x%08lx, 0x%08x,%p,0x%08lx,0x%08x) stub!\n", KeyHandle, Event, ApcRoutine, ApcContext, IoStatusBlock, CompletionFilter, Asynchroneous, ChangeBuffer, Length, WatchSubtree); - return 0; -} - - -/****************************************************************************** - * NtOpenKey [NTDLL.129] - * ZwOpenKey - * OUT PHANDLE KeyHandle, - * IN ACCESS_MASK DesiredAccess, - * IN POBJECT_ATTRIBUTES ObjectAttributes - */ -NTSTATUS WINAPI NtOpenKey( - PHANDLE KeyHandle, - ACCESS_MASK DesiredAccess, - POBJECT_ATTRIBUTES ObjectAttributes) -{ - FIXME("(%p,0x%08lx,%p (%s)),stub!\n", - KeyHandle, DesiredAccess, ObjectAttributes,debugstr_w(ObjectAttributes->ObjectName->Buffer)); - return 0; -} - -/****************************************************************************** - * NtQueryKey [NTDLL] - * ZwQueryKey - */ -NTSTATUS WINAPI NtQueryKey( - HANDLE KeyHandle, - KEY_INFORMATION_CLASS KeyInformationClass, - PVOID KeyInformation, - ULONG Length, - PULONG ResultLength) -{ - FIXME("(0x%08x,0x%08x,%p,0x%08lx,%p) stub\n", - KeyHandle, KeyInformationClass, KeyInformation, Length, ResultLength); - return 0; + return STATUS_SUCCESS; } /****************************************************************************** @@ -184,24 +541,80 @@ FIXME("(0x%08x,%p,0x%08lx,%p,0x%08lx,%p) stub!\n", KeyHandle, ListOfValuesToQuery, NumberOfItems, MultipleValueInformation, Length,ReturnLength); - return 0; + return STATUS_SUCCESS; } /****************************************************************************** * NtQueryValueKey [NTDLL] * ZwQueryValueKey + * + * NOTES + * the name in the KeyValueInformation is never set */ NTSTATUS WINAPI NtQueryValueKey( - HANDLE KeyHandle, - PUNICODE_STRING ValueName, - KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass, - PVOID KeyValueInformation, - ULONG Length, - PULONG ResultLength) + IN HANDLE KeyHandle, + IN PUNICODE_STRING ValueName, + IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass, + OUT PVOID KeyValueInformation, + IN ULONG Length, + OUT PULONG ResultLength) { - FIXME("(0x%08x,%p,0x%08x,%p,0x%08lx,%p) stub\n", - KeyHandle, ValueName, KeyValueInformationClass, KeyValueInformation, Length, ResultLength); - return 0; + struct get_key_value_request *req = get_req_buffer(); + NTSTATUS ret; + + TRACE("(0x%08x,%s,0x%08x,%p,0x%08lx,%p)\n", + KeyHandle, debugstr_us(ValueName), KeyValueInformationClass, KeyValueInformation, Length, ResultLength); + + req->hkey = KeyHandle; + if (copy_nameU(req->name, ValueName, 0) != STATUS_SUCCESS) return STATUS_BUFFER_OVERFLOW; + if (nt_server_call(REQ_GET_KEY_VALUE) != STATUS_SUCCESS) return ret; + + switch(KeyValueInformationClass) + { + case KeyValueBasicInformation: + { + PKEY_VALUE_BASIC_INFORMATION kbi = (PKEY_VALUE_BASIC_INFORMATION) KeyValueInformation; + kbi->Type = req->type; + + *ResultLength = sizeof(KEY_VALUE_BASIC_INFORMATION)-sizeof(WCHAR); + if (Length <= *ResultLength) return STATUS_BUFFER_OVERFLOW; + kbi->NameLength = 0; + } + break; + case KeyValueFullInformation: + { + PKEY_VALUE_FULL_INFORMATION kfi = (PKEY_VALUE_FULL_INFORMATION) KeyValueInformation; + ULONG DataOffset; + kfi->Type = req->type; + + DataOffset = sizeof(KEY_VALUE_FULL_INFORMATION)-sizeof(WCHAR); + *ResultLength = DataOffset + req->len; + if (Length <= *ResultLength) return STATUS_BUFFER_OVERFLOW; + + kfi->NameLength = 0; + kfi->DataOffset = DataOffset; + kfi->DataLength = req->len; + memcpy(KeyValueInformation+DataOffset, req->data, req->len); + } + break; + case KeyValuePartialInformation: + { + PKEY_VALUE_PARTIAL_INFORMATION kpi = (PKEY_VALUE_PARTIAL_INFORMATION) KeyValueInformation; + kpi->Type = req->type; + + *ResultLength = sizeof(KEY_VALUE_FULL_INFORMATION)-sizeof(UCHAR)+req->len; + if (Length <= *ResultLength) return STATUS_BUFFER_OVERFLOW; + + kpi->DataLength = req->len; + memcpy(kpi->Data, req->data, req->len); + } + break; + default: + FIXME("KeyValueInformationClass not implemented\n"); + return STATUS_UNSUCCESSFUL; + + } + return ret; } /****************************************************************************** @@ -213,11 +626,10 @@ IN HANDLE Key, IN POBJECT_ATTRIBUTES ReplacedObjectAttributes) { - FIXME("(%p(%s),0x%08x,%p (%s)),stub!\n", - ObjectAttributes,debugstr_w(ObjectAttributes->ObjectName->Buffer),Key, - ReplacedObjectAttributes,debugstr_w(ReplacedObjectAttributes->ObjectName->Buffer)); - return 0; - + FIXME("(0x%08x),stub!\n", Key); + dump_ObjectAttributes(ObjectAttributes); + dump_ObjectAttributes(ReplacedObjectAttributes); + return STATUS_SUCCESS; } /****************************************************************************** * NtRestoreKey [NTDLL] @@ -230,8 +642,7 @@ { FIXME("(0x%08x,0x%08x,0x%08lx) stub\n", KeyHandle, FileHandle, RestoreFlags); - return 0; - + return STATUS_SUCCESS; } /****************************************************************************** * NtSaveKey [NTDLL] @@ -243,7 +654,7 @@ { FIXME("(0x%08x,0x%08x) stub\n", KeyHandle, FileHandle); - return 0; + return STATUS_SUCCESS; } /****************************************************************************** * NtSetInformationKey [NTDLL] @@ -257,7 +668,7 @@ { FIXME("(0x%08x,0x%08x,%p,0x%08lx) stub\n", KeyHandle, KeyInformationClass, KeyInformation, KeyInformationLength); - return 0; + return STATUS_SUCCESS; } /****************************************************************************** * NtSetValueKey [NTDLL] @@ -272,8 +683,8 @@ ULONG DataSize) { FIXME("(0x%08x,%p(%s), 0x%08lx, 0x%08lx, %p, 0x%08lx) stub!\n", - KeyHandle, ValueName,debugstr_w(ValueName->Buffer), TitleIndex, Type, Data, DataSize); - return 1; + KeyHandle, ValueName,debugstr_us(ValueName), TitleIndex, Type, Data, DataSize); + return STATUS_SUCCESS; } @@ -286,5 +697,44 @@ { FIXME("(0x%08x) stub\n", KeyHandle); - return 0; + return STATUS_SUCCESS; +} + +/****************************************************************************** + * RtlFormatCurrentUserKeyPath [NTDLL.371] + */ +NTSTATUS WINAPI RtlFormatCurrentUserKeyPath( + IN OUT PUNICODE_STRING KeyPath) +{ +/* LPSTR Path = "\\REGISTRY\\USER\\S-1-5-21-0000000000-000000000-0000000000-500";*/ + LPSTR Path = "\\REGISTRY\\USER\\.DEFAULT"; + ANSI_STRING AnsiPath; + + FIXME("(%p) stub\n",KeyPath); + RtlInitAnsiString(&AnsiPath, Path); + return RtlAnsiStringToUnicodeString(KeyPath, &AnsiPath, TRUE); +} + +/****************************************************************************** + * RtlOpenCurrentUser [NTDLL] + * + * if we return just HKEY_CURRENT_USER the advapi try's to find a remote + * registry (odd handle) and fails + * + */ +DWORD WINAPI RtlOpenCurrentUser( + IN ACCESS_MASK DesiredAccess, + OUT PHANDLE KeyHandle) /* handle of HKEY_CURRENT_USER */ +{ + OBJECT_ATTRIBUTES ObjectAttributes; + UNICODE_STRING ObjectName; + NTSTATUS ret; + + TRACE("(0x%08lx, %p) stub\n",DesiredAccess, KeyHandle); + + RtlFormatCurrentUserKeyPath(&ObjectName); + InitializeObjectAttributes(&ObjectAttributes,&ObjectName,OBJ_CASE_INSENSITIVE,0, NULL); + ret = NtOpenKey(KeyHandle, DesiredAccess, &ObjectAttributes); + RtlFreeUnicodeString(&ObjectName); + return ret; }
diff --git a/dlls/ntdll/rtl.c b/dlls/ntdll/rtl.c index f27d663..8cfe831 100644 --- a/dlls/ntdll/rtl.c +++ b/dlls/ntdll/rtl.c
@@ -239,7 +239,7 @@ ULONG Flags, ULONG Size) { - FIXME("(0x%08x, 0x%08lx, 0x%08lx) semi stub\n", + TRACE("(0x%08x, 0x%08lx, 0x%08lx) semi stub\n", Heap, Flags, Size); return HeapAlloc(Heap, Flags, Size); } @@ -252,7 +252,7 @@ ULONG Flags, PVOID Address) { - FIXME("(0x%08x, 0x%08lx, %p) semi stub\n", + TRACE("(0x%08x, 0x%08lx, %p) semi stub\n", Heap, Flags, Address); return HeapFree(Heap, Flags, Address); } @@ -265,7 +265,7 @@ BOOLEAN WINAPI RtlDestroyHeap( HANDLE Heap) { - FIXME("(0x%08x) semi stub\n", Heap); + TRACE("(0x%08x) semi stub\n", Heap); return HeapDestroy(Heap); } @@ -347,20 +347,72 @@ /************************************************************************** * RtlNtStatusToDosError [NTDLL.442] */ -DWORD WINAPI RtlNtStatusToDosError(DWORD error) +DWORD WINAPI RtlNtStatusToDosError(DWORD Status) { - FIXME("(%lx): map STATUS_ to ERROR_\n",error); - switch (error) - { case STATUS_SUCCESS: return ERROR_SUCCESS; - case STATUS_INVALID_PARAMETER: return ERROR_BAD_ARGUMENTS; - case STATUS_BUFFER_TOO_SMALL: return ERROR_INSUFFICIENT_BUFFER; -/* case STATUS_INVALID_SECURITY_DESCR: return ERROR_INVALID_SECURITY_DESCR;*/ - case STATUS_NO_MEMORY: return ERROR_NOT_ENOUGH_MEMORY; -/* case STATUS_UNKNOWN_REVISION: - case STATUS_BUFFER_OVERFLOW:*/ + TRACE("(0x%08lx)\n",Status); + + switch (Status & 0xC0000000) + { + case 0x00000000: + switch (Status) + { +/*00*/ case STATUS_SUCCESS: return ERROR_SUCCESS; + } + break; + case 0x40000000: + switch (Status) + { + } + break; + case 0x80000000: + switch (Status) + { + case STATUS_GUARD_PAGE_VIOLATION: return STATUS_GUARD_PAGE_VIOLATION; + case STATUS_DATATYPE_MISALIGNMENT: return ERROR_NOACCESS; + case STATUS_BREAKPOINT: return STATUS_BREAKPOINT; + case STATUS_SINGLE_STEP: return STATUS_SINGLE_STEP; + case STATUS_BUFFER_OVERFLOW: return ERROR_MORE_DATA; + case STATUS_NO_MORE_FILES: return ERROR_NO_MORE_FILES; +/* case STATUS_NO_INHERITANCE: return ERROR_NO_INHERITANCE;*/ + case STATUS_PARTIAL_COPY: return ERROR_PARTIAL_COPY; +/* case STATUS_DEVICE_PAPER_EMPTY: return ERROR_OUT_OF_PAPER;*/ + case STATUS_DEVICE_POWERED_OFF: return ERROR_NOT_READY; + case STATUS_DEVICE_OFF_LINE: return ERROR_NOT_READY; + case STATUS_DEVICE_BUSY: return ERROR_BUSY; + case STATUS_NO_MORE_EAS: return ERROR_NO_MORE_ITEMS; + case STATUS_INVALID_EA_NAME: return ERROR_INVALID_EA_NAME; + case STATUS_EA_LIST_INCONSISTENT: return ERROR_EA_LIST_INCONSISTENT; + case STATUS_INVALID_EA_FLAG: return ERROR_EA_LIST_INCONSISTENT; +/* case STATUS_VERIFY_REQUIRED: return ERROR_MEDIA_CHANGED;*/ + case STATUS_NO_MORE_ENTRIES: return ERROR_NO_MORE_ITEMS; +/* case STATUS_FILEMARK_DETECTED: return ERROR_FILEMARK_DETECTED;*/ +/* case STATUS_MEDIA_CHANGED: return ERROR_MEDIA_CHANGED;*/ +/* case STATUS_BUS_RESET: return ERROR_BUS_RESET;*/ +/* case STATUS_END_OF_MEDIA: return ERROR_END_OF_MEDIA;*/ +/* case STATUS_BEGINNING_OF_MEDIA: return ERROR_BEGINNING_OF_MEDIA;*/ +/* case STATUS_SETMARK_DETECTED: return ERROR_SETMARK_DETECTED;*/ +/* case STATUS_NO_DATA_DETECTED: return ERROR_NO_DATA_DETECTED;*/ + case STATUS_ALREADY_DISCONNECTED: return ERROR_ACTIVE_CONNECTIONS; + } + break; + case 0xC0000000: + switch (Status) + { +/*01*/ case STATUS_UNSUCCESSFUL: return ERROR_GEN_FAILURE; +/*08*/ case STATUS_NO_MEMORY: return ERROR_NOT_ENOUGH_MEMORY; +/*0d*/ case STATUS_INVALID_PARAMETER: return ERROR_INVALID_PARAMETER; +/*22*/ case STATUS_ACCESS_DENIED: return ERROR_ACCESS_DENIED; +/*23*/ case STATUS_BUFFER_TOO_SMALL: return ERROR_INSUFFICIENT_BUFFER; +/*34*/ case STATUS_OBJECT_NAME_NOT_FOUND: return ERROR_FILE_NOT_FOUND; +/*15c*/ case STATUS_NOT_REGISTRY_FILE: return ERROR_NOT_REGISTRY_FILE; +/*17c*/ case STATUS_KEY_DELETED: return ERROR_KEY_DELETED; +/*181*/ case STATUS_CHILD_MUST_BE_VOLATILE: return ERROR_CHILD_MUST_BE_VOLATILE; + } + break; } - FIXME("unknown status (%lx)\n",error); - return ERROR_SUCCESS; + FIXME("unknown status (%lx)\n",Status); + return ERROR_MR_MID_NOT_FOUND; /*317*/ + } /************************************************************************** @@ -430,30 +482,6 @@ #endif } -/****************************************************************************** - * RtlFormatCurrentUserKeyPath [NTDLL.371] - */ -DWORD WINAPI RtlFormatCurrentUserKeyPath(PUNICODE_STRING String) -{ - FIXME("(%p): stub\n",String); - return 1; -} - -/****************************************************************************** - * RtlOpenCurrentUser [NTDLL] - */ -DWORD WINAPI RtlOpenCurrentUser(DWORD x1, DWORD *x2) -{ -/* Note: this is not the correct solution, - * But this works pretty good on wine and NT4.0 binaries - */ - if ( x1 == 0x2000000 ) { - *x2 = HKEY_CURRENT_USER; - return TRUE; - } - - return FALSE; -} /************************************************************************** * RtlDosPathNameToNtPathName_U [NTDLL.338] * @@ -494,3 +522,52 @@ FIXME("(0x%08lx,%s,%p),stub!\n",x1,debugstr_w(key->Buffer),val); return 0; } +/****************************************************************************** + * RtlInitializeGenericTable [NTDLL] + */ +DWORD WINAPI RtlInitializeGenericTable(void) +{ + FIXME("\n"); + return 0; +} + +/****************************************************************************** + * RtlInitializeBitMap [NTDLL] + * + */ +NTSTATUS WINAPI RtlInitializeBitMap(DWORD x1,DWORD x2,DWORD x3) +{ + FIXME("(0x%08lx,0x%08lx,0x%08lx),stub\n",x1,x2,x3); + return 0; +} + +/****************************************************************************** + * RtlSetBits [NTDLL] + * + */ +NTSTATUS WINAPI RtlSetBits(DWORD x1,DWORD x2,DWORD x3) +{ + FIXME("(0x%08lx,0x%08lx,0x%08lx),stub\n",x1,x2,x3); + return 0; +} + +/****************************************************************************** + * RtlFindClearBits [NTDLL] + * + */ +NTSTATUS WINAPI RtlFindClearBits(DWORD x1,DWORD x2,DWORD x3) +{ + FIXME("(0x%08lx,0x%08lx,0x%08lx),stub\n",x1,x2,x3); + return 0; +} + +/****************************************************************************** + * RtlClearBits [NTDLL] + * + */ +NTSTATUS WINAPI RtlClearBits(DWORD x1,DWORD x2,DWORD x3) +{ + FIXME("(0x%08lx,0x%08lx,0x%08lx),stub\n",x1,x2,x3); + return 0; +} +
diff --git a/dlls/ntdll/rtlstr.c b/dlls/ntdll/rtlstr.c index 18710a7..3c19c8e 100644 --- a/dlls/ntdll/rtlstr.c +++ b/dlls/ntdll/rtlstr.c
@@ -17,244 +17,520 @@ #include "heap.h" #include "winnls.h" #include "debugtools.h" - +#include "ntdll_misc.h" #include "ntddk.h" DEFAULT_DEBUG_CHANNEL(ntdll) -/* - * STRING FUNCTIONS - */ + +/* STRING FUNCTIONS */ /************************************************************************** - * RtlAnsiStringToUnicodeString [NTDLL.269] - */ -DWORD /* NTSTATUS */ -WINAPI RtlAnsiStringToUnicodeString(PUNICODE_STRING uni,PANSI_STRING ansi,BOOLEAN doalloc) -{ - DWORD unilen = (ansi->Length+1)*sizeof(WCHAR); - - if (unilen>0xFFFF) - return STATUS_INVALID_PARAMETER_2; - uni->Length = unilen; - if (doalloc) { - uni->MaximumLength = unilen; - uni->Buffer = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,unilen); - if (!uni->Buffer) - return STATUS_NO_MEMORY; - } - if (unilen>uni->MaximumLength) - return STATUS_BUFFER_OVERFLOW; - lstrcpynAtoW(uni->Buffer,ansi->Buffer,unilen/2); - return STATUS_SUCCESS; -} - -/************************************************************************** - * RtlOemStringToUnicodeString [NTDLL.447] - */ -DWORD /* NTSTATUS */ -WINAPI RtlOemStringToUnicodeString(PUNICODE_STRING uni,PSTRING ansi,BOOLEAN doalloc) -{ - DWORD unilen = (ansi->Length+1)*sizeof(WCHAR); - - if (unilen>0xFFFF) - return STATUS_INVALID_PARAMETER_2; - uni->Length = unilen; - if (doalloc) { - uni->MaximumLength = unilen; - uni->Buffer = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,unilen); - if (!uni->Buffer) - return STATUS_NO_MEMORY; - } - if (unilen>uni->MaximumLength) - return STATUS_BUFFER_OVERFLOW; - lstrcpynAtoW(uni->Buffer,ansi->Buffer,unilen/2); - return STATUS_SUCCESS; -} -/************************************************************************** - * RtlMultiByteToUnicodeN [NTDLL.436] - * FIXME: multibyte support - */ -DWORD /* NTSTATUS */ -WINAPI RtlMultiByteToUnicodeN(LPWSTR unistr,DWORD unilen,LPDWORD reslen,LPSTR oemstr,DWORD oemlen) -{ - DWORD len; - LPWSTR x; - - len = oemlen; - if (unilen/2 < len) - len = unilen/2; - x=(LPWSTR)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,(len+1)*sizeof(WCHAR)); - lstrcpynAtoW(x,oemstr,len+1); - memcpy(unistr,x,len*2); - if (reslen) *reslen = len*2; - return 0; -} - -/************************************************************************** - * RtlOemToUnicodeN [NTDLL.448] - */ -DWORD /* NTSTATUS */ -WINAPI RtlOemToUnicodeN(LPWSTR unistr,DWORD unilen,LPDWORD reslen,LPSTR oemstr,DWORD oemlen) -{ - DWORD len; - LPWSTR x; - - len = oemlen; - if (unilen/2 < len) - len = unilen/2; - x=(LPWSTR)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,(len+1)*sizeof(WCHAR)); - lstrcpynAtoW(x,oemstr,len+1); - memcpy(unistr,x,len*2); - if (reslen) *reslen = len*2; - return 0; -} - -/************************************************************************** - * RtlInitAnsiString [NTDLL.399] - */ -VOID WINAPI RtlInitAnsiString(PANSI_STRING target,LPCSTR source) -{ - target->Length = target->MaximumLength = 0; - target->Buffer = (LPSTR)source; - if (!source) - return; - target->MaximumLength = lstrlenA(target->Buffer); - target->Length = target->MaximumLength+1; -} -/************************************************************************** - * RtlInitString [NTDLL.402] + * RtlInitString */ VOID WINAPI RtlInitString(PSTRING target,LPCSTR source) { - target->Length = target->MaximumLength = 0; + TRACE("%p %p(%s)\n", target, source, debugstr_a(source)); + target->Buffer = (LPSTR)source; - if (!source) - return; - target->MaximumLength = lstrlenA(target->Buffer); - target->Length = target->MaximumLength+1; + if (source) + { + target->Length = lstrlenA(source); + target->MaximumLength = target->Length+1; + } + else + { + target->Length = target->MaximumLength = 0; + } +} + + + +/* ANSI FUNCTIONS */ + +/************************************************************************** + * RtlInitAnsiString + */ +VOID WINAPI RtlInitAnsiString( + PANSI_STRING target, + LPCSTR source) +{ + TRACE("%p %p(%s)\n", target, source, debugstr_a(source)); + + target->Buffer = (LPSTR)source; + if (source) + { + target->Length = lstrlenA(source); + target->MaximumLength = target->Length+1; + } + else + { + target->Length = target->MaximumLength = 0; + } } /************************************************************************** - * RtlInitUnicodeString [NTDLL.403] + * RtlFreeAnsiString */ -VOID WINAPI RtlInitUnicodeString(PUNICODE_STRING target,LPCWSTR source) +VOID WINAPI RtlFreeAnsiString( + PANSI_STRING AnsiString) +{ + TRACE("%p\n", AnsiString); + dump_AnsiString(AnsiString, TRUE); + + if( AnsiString->Buffer ) + HeapFree( GetProcessHeap(),0,AnsiString->Buffer ); +} + + + +/* UNICODE FUNCTIONS */ + +/************************************************************************** + * RtlInitUnicodeString [NTDLL.403] + */ +VOID WINAPI RtlInitUnicodeString( + PUNICODE_STRING target, + LPCWSTR source) { TRACE("%p %p(%s)\n", target, source, debugstr_w(source)); - target->Length = target->MaximumLength = 0; target->Buffer = (LPWSTR)source; - if (!source) - return; - target->MaximumLength = lstrlenW(target->Buffer)*2; - target->Length = target->MaximumLength+2; -} - -/************************************************************************** - * RtlFreeUnicodeString [NTDLL.377] - */ -VOID WINAPI RtlFreeUnicodeString(PUNICODE_STRING str) -{ - if (str->Buffer) - HeapFree(GetProcessHeap(),0,str->Buffer); -} - -/************************************************************************** - * RtlFreeAnsiString [NTDLL.373] - */ -VOID WINAPI RtlFreeAnsiString(PANSI_STRING AnsiString) -{ - if( AnsiString->Buffer ) - HeapFree( GetProcessHeap(),0,AnsiString->Buffer ); -} - - -/************************************************************************** - * RtlUnicodeToOemN [NTDLL.515] - */ -DWORD /* NTSTATUS */ -WINAPI RtlUnicodeToOemN(LPSTR oemstr,DWORD oemlen,LPDWORD reslen,LPWSTR unistr,DWORD unilen) -{ - DWORD len; - LPSTR x; - - len = oemlen; - if (unilen/2 < len) - len = unilen/2; - x=(LPSTR)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,len+1); - lstrcpynWtoA(x,unistr,len+1); - memcpy(oemstr,x,len); - if (reslen) *reslen = len; - return 0; -} - -/************************************************************************** - * RtlUnicodeStringToOemString [NTDLL.511] - */ -DWORD /* NTSTATUS */ -WINAPI RtlUnicodeStringToOemString(PANSI_STRING oem,PUNICODE_STRING uni,BOOLEAN alloc) -{ - if (alloc) { - oem->Buffer = (LPSTR)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,uni->Length/2)+1; - oem->MaximumLength = uni->Length/2+1; + if (source) + { + target->Length = lstrlenW(source)*2; + target->MaximumLength = target->Length + 2; } - oem->Length = uni->Length/2; - lstrcpynWtoA(oem->Buffer,uni->Buffer,uni->Length/2+1); - return 0; -} - -/************************************************************************** - * RtlUnicodeStringToAnsiString [NTDLL.507] - */ -DWORD /* NTSTATUS */ -WINAPI RtlUnicodeStringToAnsiString(PANSI_STRING oem,PUNICODE_STRING uni,BOOLEAN alloc) -{ - if (alloc) { - oem->Buffer = (LPSTR)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,uni->Length/2)+1; - oem->MaximumLength = uni->Length/2+1; + else + { + target->Length = target->MaximumLength = 0; } - oem->Length = uni->Length/2; - lstrcpynWtoA(oem->Buffer,uni->Buffer,uni->Length/2+1); - return 0; } /************************************************************************** - * RtlEqualUnicodeString [NTDLL] + * RtlFreeUnicodeString [NTDLL.377] */ -DWORD WINAPI RtlEqualUnicodeString(PUNICODE_STRING s1,PUNICODE_STRING s2,DWORD x) { - FIXME("(%s,%s,%ld),stub!\n",debugstr_w(s1->Buffer),debugstr_w(s2->Buffer),x); - return 0; - if (s1->Length != s2->Length) - return 1; - return !CRTDLL_wcsncmp(s1->Buffer,s2->Buffer,s1->Length/2); -} - -/************************************************************************** - * RtlUpcaseUnicodeString [NTDLL.520] - */ -DWORD WINAPI RtlUpcaseUnicodeString(PUNICODE_STRING dest,PUNICODE_STRING src,BOOLEAN doalloc) +VOID WINAPI RtlFreeUnicodeString( + PUNICODE_STRING UnicodeString) { - LPWSTR s,t; - DWORD i,len; + TRACE("%p\n", UnicodeString); + dump_UnicodeString(UnicodeString, TRUE); - len = src->Length; - if (doalloc) { - dest->MaximumLength = len; - dest->Buffer = (LPWSTR)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,len); - if (!dest->Buffer) - return STATUS_NO_MEMORY; + if (UnicodeString->Buffer) + HeapFree(GetProcessHeap(),0,UnicodeString->Buffer); +} +/* + COMPARE FUNCTIONS +*/ + +/************************************************************************** + * RtlEqualUnicodeString + */ +BOOLEAN WINAPI RtlEqualUnicodeString( + IN PUNICODE_STRING s1, + IN PUNICODE_STRING s2, + IN BOOLEAN CaseInsensitive) +{ + BOOLEAN ret; + TRACE("(%p,%p,%x)\n",s1,s2,CaseInsensitive); + dump_UnicodeString(s1, TRUE); + dump_UnicodeString(s2, TRUE); + + if(!s1 || !s2 || !s1->Buffer || !s2->Buffer) return FALSE; + if (s1->Length != s2->Length) return FALSE; + + if (CaseInsensitive) + ret = !CRTDLL__wcsnicmp(s1->Buffer,s2->Buffer,s1->Length/sizeof(WCHAR)); + else + ret = !CRTDLL_wcsncmp(s1->Buffer,s2->Buffer,s1->Length/sizeof(WCHAR)); + return ret; +} + +/****************************************************************************** + * RtlCompareUnicodeString + */ +LONG WINAPI RtlCompareUnicodeString( + PUNICODE_STRING s1, + PUNICODE_STRING s2, + BOOLEAN CaseInsensitive) +{ + LONG ret; + + TRACE("(%p,%p,%x)\n",s1,s2,CaseInsensitive); + dump_UnicodeString(s1, TRUE); + dump_UnicodeString(s2, TRUE); + + if(!s1 || !s2 || !s1->Buffer || !s2->Buffer) return FALSE; + + if (s1->Length != s2->Length) return (s1->Length - s2->Length); + + if (CaseInsensitive) + ret = CRTDLL__wcsnicmp(s1->Buffer,s2->Buffer,s1->Length/sizeof(WCHAR)); + else + ret = CRTDLL_wcsncmp(s1->Buffer,s2->Buffer,s1->Length/sizeof(WCHAR)); + return ret; +} + +/* + COPY BETWEEN ANSI_STRING or UNICODE_STRING + there is no parameter checking, it just crashes +*/ + +/************************************************************************** + * RtlAnsiStringToUnicodeString + * + * NOTES: + * writes terminating 0 + */ +NTSTATUS +WINAPI RtlAnsiStringToUnicodeString( + PUNICODE_STRING uni, + PANSI_STRING ansi, + BOOLEAN doalloc) +{ + int len = ansi->Length * sizeof(WCHAR); + + TRACE("%p %p %u\n",uni, ansi, doalloc); + dump_AnsiString(ansi, TRUE); + dump_UnicodeString(uni, FALSE); + + if (len>0xfffe) return STATUS_INVALID_PARAMETER_2; + uni->Length = len; + if (doalloc) + { + uni->Buffer = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,uni->MaximumLength); + if (!uni->Buffer) return STATUS_NO_MEMORY; + uni->MaximumLength = len + sizeof(WCHAR); } - if (dest->MaximumLength < len) - return STATUS_BUFFER_OVERFLOW; - s=dest->Buffer;t=src->Buffer; - /* len is in bytes */ - for (i=0;i<len/2;i++) - s[i] = towupper(t[i]); + else if (len+sizeof(WCHAR) > uni->MaximumLength) + { + return STATUS_BUFFER_OVERFLOW; + } + lstrcpynAtoW(uni->Buffer,ansi->Buffer,ansi->Length+1); return STATUS_SUCCESS; } /************************************************************************** - * RtlxOemStringToUnicodeSize [NTDLL.549] + * RtlUpcaseUnicodeString + * + * NOTES: + * destination string is never 0-terminated because dest can be equal to src + * and src might be not 0-terminated + * dest.Length only set when success + */ +DWORD WINAPI RtlUpcaseUnicodeString( + PUNICODE_STRING dest, + PUNICODE_STRING src, + BOOLEAN doalloc) +{ + int i, len = src->Length; + + TRACE("(%p,%p,%x)\n",dest, src, doalloc); + dump_UnicodeString(dest, FALSE); + dump_UnicodeString(src, TRUE); + + if (doalloc) + { + dest->Buffer = (LPWSTR)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, len); + if (!dest->Buffer) return STATUS_NO_MEMORY; + dest->MaximumLength = len; + } + else if (len > dest->MaximumLength) + { + return STATUS_BUFFER_OVERFLOW; + } + + for (i=0; i < len/sizeof(WCHAR); i++) + { + dest->Buffer[i] = towupper(src->Buffer[i]); + } + dest->Length = len; + return STATUS_SUCCESS; +} + +/************************************************************************** + * RtlOemStringToUnicodeString + * + * NOTES + * writes terminating 0 + * buffer must be bigger than (ansi->Length+1)*2 + * if astr.Length > 0x7ffe it returns STATUS_INVALID_PARAMETER_2 + * + * FIXME + * OEM to unicode + */ +NTSTATUS +WINAPI RtlOemStringToUnicodeString( + PUNICODE_STRING uni, + PSTRING ansi, + BOOLEAN doalloc) +{ + int len = ansi->Length * sizeof(WCHAR); + + if (len > 0xfffe) return STATUS_INVALID_PARAMETER_2; + + uni->Length = len; + if (doalloc) + { + uni->Buffer = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY, len + sizeof(WCHAR)); + if (!uni->Buffer) return STATUS_NO_MEMORY; + uni->MaximumLength = len + sizeof(WCHAR); + } + else if (len+1 > uni->MaximumLength ) + { + return STATUS_BUFFER_OVERFLOW; + } + lstrcpynAtoW(uni->Buffer,ansi->Buffer,ansi->Length+1); + return STATUS_SUCCESS; +} + +/************************************************************************** + * RtlUnicodeStringToOemString + * + * NOTES + * allocates uni->Length+1 + * writes terminating 0 + */ +NTSTATUS +WINAPI RtlUnicodeStringToOemString( + PANSI_STRING oem, + PUNICODE_STRING uni, + BOOLEAN doalloc) +{ + int len = uni->Length/sizeof(WCHAR); + + TRACE("%p %s %i\n", oem, debugstr_us(uni), doalloc); + + oem->Length = len; + if (doalloc) + { + oem->Buffer = (LPSTR)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, len+1); + if (! oem->Buffer) return STATUS_NO_MEMORY; + oem->MaximumLength = len + 1; + } + else if (oem->MaximumLength <= len) + { + return STATUS_BUFFER_OVERFLOW; + } + lstrcpynWtoA(oem->Buffer, uni->Buffer, len+1); + return STATUS_SUCCESS; +} + +/************************************************************************** + * RtlUpcaseUnicodeStringToOemString + * + * NOTES + * writes terminating 0 + */ +NTSTATUS +WINAPI RtlUpcaseUnicodeStringToOemString( + PANSI_STRING oem, + PUNICODE_STRING uni, + BOOLEAN doalloc) +{ + int i, len = uni->Length/sizeof(WCHAR); + + TRACE("%p %s %i\n", oem, debugstr_us(uni), doalloc); + + oem->Length = len; + if (doalloc) + { + oem->Buffer = (LPSTR)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, len+1); + if (! oem->Buffer) return STATUS_NO_MEMORY; + oem->MaximumLength = len + 1; + } + else if (oem->MaximumLength <= len) + { + return STATUS_BUFFER_OVERFLOW; + } + + for (i=0; i < len; i++) + { + oem->Buffer[i] = towupper((char)(uni->Buffer[i])); + } + oem->Buffer[i] = 0; + return STATUS_SUCCESS; +} + +/************************************************************************** + * RtlUnicodeStringToAnsiString + * + * NOTES + * writes terminating 0 + * copys a part if the buffer is to small + */ +NTSTATUS +WINAPI RtlUnicodeStringToAnsiString( + PANSI_STRING ansi, + PUNICODE_STRING uni, + BOOLEAN doalloc) +{ + int len = uni->Length/sizeof(WCHAR); + NTSTATUS ret = STATUS_SUCCESS; + + TRACE("%p %s %i\n", ansi, debugstr_us(uni), doalloc); + + ansi->Length = len; + if (doalloc) + { + ansi->Buffer = (LPSTR)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, len+1); + if (! ansi->Buffer) return STATUS_NO_MEMORY; + ansi->MaximumLength = len + 1; + } + else if (ansi->MaximumLength <= len) + { + ansi->Length = ansi->MaximumLength - 1; + ret = STATUS_BUFFER_OVERFLOW; + } + lstrcpynWtoA(ansi->Buffer, uni->Buffer, ansi->Length+1); + return ret; +} + +/* + COPY BETWEEN ANSI/UNICODE_STRING AND MULTIBYTE STRINGS +*/ +/************************************************************************** + * RtlMultiByteToUnicodeN + * + * NOTES + * dest can be equal to src + * if unistr is to small a part is copyed + * + * FIXME + * multibyte support + */ +NTSTATUS +WINAPI RtlMultiByteToUnicodeN( + LPWSTR unistr, + DWORD unilen, + LPDWORD reslen, + LPSTR oemstr, + DWORD oemlen) +{ + UINT len; + int i; + + TRACE("%p %lu, %p, %s, %lu\n", oemstr, oemlen, reslen, debugstr_w(unistr), unilen); + + len = (unilen/sizeof(WCHAR) < oemlen) ? unilen/sizeof(WCHAR) : oemlen; + + for (i = len-1; i>=0; i--) + unistr[i] = (WCHAR)oemstr[i]; + + if (reslen) *reslen = len * 2; + return 0; +} + +/************************************************************************** + * RtlOemToUnicodeN + */ +NTSTATUS +WINAPI RtlOemToUnicodeN( + LPWSTR unistr, + DWORD unilen, + LPDWORD reslen, + LPSTR oemstr, + DWORD oemlen) +{ + UINT len; + int i; + + TRACE("%p %lu, %p, %s, %lu\n", oemstr, oemlen, reslen, debugstr_w(unistr), unilen); + + len = (unilen/sizeof(WCHAR) < oemlen) ? unilen/sizeof(WCHAR) : oemlen; + + for (i = len-1; i>=0; i--) + unistr[i] = (WCHAR)oemstr[i]; + + if (reslen) *reslen = len * 2; + return 0; +} + + +/************************************************************************** + * RtlUnicodeToOemN + */ +NTSTATUS +WINAPI RtlUnicodeToOemN( + LPSTR oemstr, + DWORD oemlen, + LPDWORD reslen, + LPWSTR unistr, + DWORD unilen) +{ + UINT len; + int i; + + TRACE("%p %lu, %p, %s, %lu\n", oemstr, oemlen, reslen, debugstr_w(unistr), unilen); + + len = (oemlen < unilen/sizeof(WCHAR)) ? unilen/sizeof(WCHAR) : oemlen; + + for (i = len-1; i>=0; i--) + oemstr[i] = (CHAR)unistr[i]; + + if (reslen) *reslen = len * 2; + return 0; +} + +/************************************************************************** + * RtlUpcaseUnicodeToOemN + */ +NTSTATUS +WINAPI RtlUpcaseUnicodeToOemN( + LPSTR oemstr, + DWORD oemlen, + LPDWORD reslen, + LPWSTR unistr, + DWORD unilen) +{ + UINT len; + int i; + + TRACE("%p %lu, %p, %s, %lu\n", oemstr, oemlen, reslen, debugstr_w(unistr), unilen); + + len = (oemlen < unilen/sizeof(WCHAR)) ? unilen/sizeof(WCHAR) : oemlen; + + for (i = len-1; i>=0; i--) + oemstr[i] = toupper((CHAR)unistr[i]); + + if (reslen) *reslen = len * 2; + return 0; +} + +/************************************************************************** + * RtlUnicodeToMultiByteN + */ +NTSTATUS WINAPI RtlUnicodeToMultiByteN( + PCHAR MbString, + ULONG MbSize, + PULONG ResultSize, + PWCHAR UnicodeString, + ULONG UnicodeSize) +{ + int Size = 0, i; + + TRACE("(%p,%lu,%p,%p(%s),%lu)\n", + MbString, MbSize, ResultSize, UnicodeString, debugstr_w(UnicodeString), UnicodeSize); + + Size = (UnicodeSize > (MbSize*sizeof(WCHAR))) ? MbSize: UnicodeSize/sizeof(WCHAR); + + if (ResultSize != NULL) *ResultSize = Size; + + for(i = 0; i < Size; i++) + { + *(MbString++) = *(UnicodeString++); + } + return STATUS_SUCCESS; +} + +/* + STRING SIZE + + Rtlx* supports multibyte +*/ + +/************************************************************************** + * RtlxOemStringToUnicodeSize */ UINT WINAPI RtlxOemStringToUnicodeSize(PSTRING str) { @@ -262,7 +538,7 @@ } /************************************************************************** - * RtlxAnsiStringToUnicodeSize [NTDLL.548] + * RtlxAnsiStringToUnicodeSize */ UINT WINAPI RtlxAnsiStringToUnicodeSize(PANSI_STRING str) { @@ -270,13 +546,29 @@ } /************************************************************************** - * RtlIsTextUnicode [NTDLL.417] + * RtlxUnicodeStringToOemSize + * + */ +UINT WINAPI RtlxUnicodeStringToOemSize(PUNICODE_STRING str) +{ + return str->Length+1; +} + +/* + MISC +*/ + +/************************************************************************** + * RtlIsTextUnicode * * Apply various feeble heuristics to guess whether * the text buffer contains Unicode. * FIXME: should implement more tests. */ -DWORD WINAPI RtlIsTextUnicode(LPVOID buf, DWORD len, DWORD *pf) +DWORD WINAPI RtlIsTextUnicode( + LPVOID buf, + DWORD len, + DWORD *pf) { LPWSTR s = buf; DWORD flags = -1, out_flags = 0; @@ -312,15 +604,15 @@ return len; } - -/****************************************************************************** - * RtlCompareUnicodeString [NTDLL] +/************************************************************************** + * RtlPrefixUnicodeString */ -NTSTATUS WINAPI RtlCompareUnicodeString( - PUNICODE_STRING String1, PUNICODE_STRING String2, BOOLEAN CaseInSensitive) +NTSTATUS WINAPI RtlPrefixUnicodeString( + PUNICODE_STRING a, + PUNICODE_STRING b, + DWORD x) { - FIXME("(%s,%s,0x%08x),stub!\n",debugstr_w(String1->Buffer),debugstr_w(String1->Buffer),CaseInSensitive); - return 0; + TRACE("(%s,%s,%lx)\n",debugstr_us(a),debugstr_us(b),x); + return STATUS_SUCCESS; } -
diff --git a/dlls/ntdll/sec.c b/dlls/ntdll/sec.c index 251db26..cabe235 100644 --- a/dlls/ntdll/sec.c +++ b/dlls/ntdll/sec.c
@@ -26,6 +26,8 @@ DEFAULT_DEBUG_CHANNEL(ntdll) +#define NT_SUCCESS(status) (status == STATUS_SUCCESS) + /* * SID FUNCTIONS */ @@ -34,95 +36,212 @@ * RtlAllocateAndInitializeSid [NTDLL.265] * */ -BOOLEAN WINAPI RtlAllocateAndInitializeSid (PSID_IDENTIFIER_AUTHORITY pIdentifierAuthority, - DWORD nSubAuthorityCount,DWORD x3,DWORD x4,DWORD x5,DWORD x6,DWORD x7,DWORD x8,DWORD x9,DWORD x10, PSID pSid) +BOOLEAN WINAPI RtlAllocateAndInitializeSid ( + PSID_IDENTIFIER_AUTHORITY pIdentifierAuthority, + BYTE nSubAuthorityCount, + DWORD nSubAuthority0, DWORD nSubAuthority1, + DWORD nSubAuthority2, DWORD nSubAuthority3, + DWORD nSubAuthority4, DWORD nSubAuthority5, + DWORD nSubAuthority6, DWORD nSubAuthority7, + PSID *pSid ) { - FIXME("(%p,0x%08lx,0x%08lx,0x%08lx,0x%08lx,0x%08lx,0x%08lx,0x%08lx,0x%08lx,0x%08lx,%p),stub!\n", - pIdentifierAuthority,nSubAuthorityCount,x3,x4,x5,x6,x7,x8,x9,x10,pSid); - return 0; + TRACE("(%p, 0x%04x,0x%08lx,0x%08lx,0x%08lx,0x%08lx,0x%08lx,0x%08lx,0x%08lx,0x%08lx,%p)\n", + pIdentifierAuthority,nSubAuthorityCount, + nSubAuthority0, nSubAuthority1, nSubAuthority2, nSubAuthority3, + nSubAuthority4, nSubAuthority5, nSubAuthority6, nSubAuthority7, pSid); + + if (!(*pSid = HeapAlloc( GetProcessHeap(), 0, RtlLengthRequiredSid(nSubAuthorityCount)))) + return FALSE; + + (*pSid)->Revision = SID_REVISION; + + if (pIdentifierAuthority) + memcpy(&(*pSid)->IdentifierAuthority, pIdentifierAuthority, sizeof (SID_IDENTIFIER_AUTHORITY)); + *GetSidSubAuthorityCount(*pSid) = nSubAuthorityCount; + + if (nSubAuthorityCount > 0) + *GetSidSubAuthority(*pSid, 0) = nSubAuthority0; + if (nSubAuthorityCount > 1) + *GetSidSubAuthority(*pSid, 1) = nSubAuthority1; + if (nSubAuthorityCount > 2) + *GetSidSubAuthority(*pSid, 2) = nSubAuthority2; + if (nSubAuthorityCount > 3) + *GetSidSubAuthority(*pSid, 3) = nSubAuthority3; + if (nSubAuthorityCount > 4) + *GetSidSubAuthority(*pSid, 4) = nSubAuthority4; + if (nSubAuthorityCount > 5) + *GetSidSubAuthority(*pSid, 5) = nSubAuthority5; + if (nSubAuthorityCount > 6) + *GetSidSubAuthority(*pSid, 6) = nSubAuthority6; + if (nSubAuthorityCount > 7) + *GetSidSubAuthority(*pSid, 7) = nSubAuthority7; + + return STATUS_SUCCESS; } /****************************************************************************** * RtlEqualSid [NTDLL.352] * */ -DWORD WINAPI RtlEqualSid(DWORD x1,DWORD x2) -{ - FIXME("(0x%08lx,0x%08lx),stub!\n", x1,x2); - return TRUE; +BOOL WINAPI RtlEqualSid( PSID pSid1, PSID pSid2 ) +{ + if (!RtlValidSid(pSid1) || !RtlValidSid(pSid2)) + return FALSE; + + if (*RtlSubAuthorityCountSid(pSid1) != *RtlSubAuthorityCountSid(pSid2)) + return FALSE; + + if (memcmp(pSid1, pSid2, GetLengthSid(pSid1)) != 0) + return FALSE; + + return TRUE; } /****************************************************************************** + * RtlEqualPrefixSid [ntdll.] + */ +BOOL WINAPI RtlEqualPrefixSid (PSID pSid1, PSID pSid2) +{ + if (!RtlValidSid(pSid1) || !RtlValidSid(pSid2)) + return FALSE; + + if (*RtlSubAuthorityCountSid(pSid1) != *RtlSubAuthorityCountSid(pSid2)) + return FALSE; + + if (memcmp(pSid1, pSid2, RtlLengthRequiredSid(pSid1->SubAuthorityCount - 1)) != 0) + return FALSE; + + return TRUE; +} + + +/****************************************************************************** * RtlFreeSid [NTDLL.376] */ -DWORD WINAPI RtlFreeSid(DWORD x1) +DWORD WINAPI RtlFreeSid(PSID pSid) { - FIXME("(0x%08lx),stub!\n", x1); - return TRUE; + TRACE("(%p)\n", pSid); + HeapFree( GetProcessHeap(), 0, pSid ); + return STATUS_SUCCESS; } /************************************************************************** - * RtlLengthRequiredSid [NTDLL.427] + * RtlLengthRequiredSid [NTDLL.427] + * + * PARAMS + * nSubAuthorityCount [] */ DWORD WINAPI RtlLengthRequiredSid(DWORD nrofsubauths) { - return sizeof(DWORD)*nrofsubauths+sizeof(SID); + return (nrofsubauths-1)*sizeof(DWORD) + sizeof(SID); } /************************************************************************** * RtlLengthSid [NTDLL.429] */ -DWORD WINAPI RtlLengthSid(PSID sid) +DWORD WINAPI RtlLengthSid(PSID pSid) { - TRACE("sid=%p\n",sid); - if (!sid) - return FALSE; - return sizeof(DWORD)*sid->SubAuthorityCount+sizeof(SID); + TRACE("sid=%p\n",pSid); + if (!pSid) return 0; + return RtlLengthRequiredSid(*RtlSubAuthorityCountSid(pSid)); } /************************************************************************** * RtlInitializeSid [NTDLL.410] */ -DWORD WINAPI RtlInitializeSid(PSID PSID,PSID_IDENTIFIER_AUTHORITY PSIDauth, - DWORD c) +BOOL WINAPI RtlInitializeSid( + PSID pSid, + PSID_IDENTIFIER_AUTHORITY pIdentifierAuthority, + BYTE nSubAuthorityCount) { - BYTE a = c&0xff; + int i; + if (nSubAuthorityCount >= SID_MAX_SUB_AUTHORITIES) + return FALSE; - if (a>=SID_MAX_SUB_AUTHORITIES) - return a; - PSID->SubAuthorityCount = a; - PSID->Revision = SID_REVISION; - memcpy(&(PSID->IdentifierAuthority),PSIDauth,sizeof(SID_IDENTIFIER_AUTHORITY)); - return STATUS_SUCCESS; + pSid->Revision = SID_REVISION; + pSid->SubAuthorityCount = nSubAuthorityCount; + if (pIdentifierAuthority) + memcpy(&pSid->IdentifierAuthority, pIdentifierAuthority, sizeof (SID_IDENTIFIER_AUTHORITY)); + + for (i = 0; i < nSubAuthorityCount; i++) + *GetSidSubAuthority(pSid, i) = 0; + + return TRUE; } /************************************************************************** * RtlSubAuthoritySid [NTDLL.497] + * + * PARAMS + * pSid [] + * nSubAuthority [] */ -LPDWORD WINAPI RtlSubAuthoritySid(PSID PSID,DWORD nr) +LPDWORD WINAPI RtlSubAuthoritySid( PSID pSid, DWORD nSubAuthority ) { - return &(PSID->SubAuthority[nr]); + return &(pSid->SubAuthority[nSubAuthority]); +} + +/************************************************************************** + * RtlIdentifierAuthoritySid [NTDLL.395] + * + * PARAMS + * pSid [] + */ +PSID_IDENTIFIER_AUTHORITY WINAPI RtlIdentifierAuthoritySid( PSID pSid ) +{ + return &(pSid->IdentifierAuthority); } /************************************************************************** * RtlSubAuthorityCountSid [NTDLL.496] + * + * PARAMS + * pSid [] + * nSubAuthority [] */ - -LPBYTE WINAPI RtlSubAuthorityCountSid(PSID PSID) +LPBYTE WINAPI RtlSubAuthorityCountSid(PSID pSid) { - return ((LPBYTE)PSID)+1; + return &(pSid->SubAuthorityCount); } /************************************************************************** * RtlCopySid [NTDLL.302] */ -DWORD WINAPI RtlCopySid(DWORD len,PSID to,PSID from) -{ if (!from) - return 0; - if (len<(from->SubAuthorityCount*4+8)) - return STATUS_BUFFER_TOO_SMALL; - memmove(to,from,from->SubAuthorityCount*4+8); - return STATUS_SUCCESS; +DWORD WINAPI RtlCopySid( DWORD nDestinationSidLength, PSID pDestinationSid, PSID pSourceSid ) +{ + if (!pSourceSid || !RtlValidSid(pSourceSid) || + (nDestinationSidLength < RtlLengthSid(pSourceSid))) + return FALSE; + + if (nDestinationSidLength < (pSourceSid->SubAuthorityCount*4+8)) + return FALSE; + + memmove(pDestinationSid, pSourceSid, pSourceSid->SubAuthorityCount*4+8); + return TRUE; } +/****************************************************************************** + * RtlValidSid [NTDLL.532] + * + * PARAMS + * pSid [] + */ +BOOL WINAPI +RtlValidSid( PSID pSid ) +{ + if (IsBadReadPtr(pSid, 4)) + { + WARN("(%p): invalid pointer!\n", pSid); + return FALSE; + } + + if (pSid->SubAuthorityCount > SID_MAX_SUB_AUTHORITIES) + return FALSE; + + if (!pSid || pSid->Revision != SID_REVISION) + return FALSE; + + return TRUE; +} + /* * security descriptor functions @@ -387,6 +506,19 @@ return STATUS_SUCCESS; } +/************************************************************************** + * RtlMakeSelfRelativeSD [NTDLL] + */ +NTSTATUS WINAPI RtlMakeSelfRelativeSD( + IN PSECURITY_DESCRIPTOR pAbsoluteSecurityDescriptor, + IN PSECURITY_DESCRIPTOR pSelfRelativeSecurityDescriptor, + IN OUT LPDWORD lpdwBufferLength) +{ + FIXME("(%p,%p,%p(%lu))\n", pAbsoluteSecurityDescriptor, + pSelfRelativeSecurityDescriptor, lpdwBufferLength,*lpdwBufferLength); + return STATUS_SUCCESS; +} + /* * access control list's */ @@ -397,8 +529,10 @@ * NOTES * This should return NTSTATUS */ -DWORD WINAPI RtlCreateAcl(PACL acl,DWORD size,DWORD rev) +NTSTATUS WINAPI RtlCreateAcl(PACL acl,DWORD size,DWORD rev) { + TRACE("%p 0x%08lx 0x%08lx\n", acl, size, rev); + if (rev!=ACL_REVISION) return STATUS_INVALID_PARAMETER; if (size<sizeof(ACL)) @@ -470,9 +604,14 @@ /****************************************************************************** * RtlAddAccessAllowedAce [NTDLL] */ -DWORD WINAPI RtlAddAccessAllowedAce(DWORD x1,DWORD x2,DWORD x3,DWORD x4) +BOOL WINAPI RtlAddAccessAllowedAce( + IN OUT PACL pAcl, + IN DWORD dwAceRevision, + IN DWORD AccessMask, + IN PSID pSid) { - FIXME("(0x%08lx,0x%08lx,0x%08lx,0x%08lx),stub!\n",x1,x2,x3,x4); + FIXME("(%p,0x%08lx,0x%08lx,%p),stub!\n", + pAcl, dwAceRevision, AccessMask, pSid); return 0; } @@ -498,3 +637,53 @@ return 0; } +/****************************************************************************** + * RtlImpersonateSelf [NTDLL] + */ +BOOL WINAPI +RtlImpersonateSelf(SECURITY_IMPERSONATION_LEVEL ImpersonationLevel) +{ + FIXME("(%08x), stub\n", ImpersonationLevel); + return TRUE; +} + +NTSTATUS WINAPI +NtAccessCheck( + IN PSECURITY_DESCRIPTOR SecurityDescriptor, + IN HANDLE ClientToken, + IN ACCESS_MASK DesiredAccess, + IN PGENERIC_MAPPING GenericMapping, + OUT PPRIVILEGE_SET PrivilegeSet, + OUT PULONG ReturnLength, + OUT PULONG GrantedAccess, + OUT PBOOLEAN AccessStatus) +{ + FIXME("(%p, %04x, %08lx, %p, %p, %p, %p, %p), stub\n", + SecurityDescriptor, ClientToken, DesiredAccess, GenericMapping, + PrivilegeSet, ReturnLength, GrantedAccess, AccessStatus); + *AccessStatus = TRUE; + return STATUS_SUCCESS; +} + +NTSTATUS WINAPI +NtSetSecurityObject( + IN HANDLE Handle, + IN SECURITY_INFORMATION SecurityInformation, + IN PSECURITY_DESCRIPTOR SecurityDescriptor) +{ + FIXME("0x%08x 0x%08lx %p\n", Handle, SecurityInformation, SecurityDescriptor); + return STATUS_SUCCESS; +} + +/****************************************************************************** + * RtlGetControlSecurityDescriptor + */ + +NTSTATUS WINAPI RtlGetControlSecurityDescriptor( + PSECURITY_DESCRIPTOR pSecurityDescriptor, + PSECURITY_DESCRIPTOR_CONTROL pControl, + LPDWORD lpdwRevision) +{ + FIXME("(%p,%p,%p),stub!\n",pSecurityDescriptor,pControl,lpdwRevision); + return STATUS_SUCCESS; +}
diff --git a/dlls/ntdll/sync.c b/dlls/ntdll/sync.c index 9d2a352..4fb7f8b 100644 --- a/dlls/ntdll/sync.c +++ b/dlls/ntdll/sync.c
@@ -9,16 +9,46 @@ #include "debugstr.h" #include "debugtools.h" +#include "winerror.h" +#include "server.h" #include "ntddk.h" +#include "ntdll_misc.h" DEFAULT_DEBUG_CHANNEL(ntdll) +#define nt_server_call(kind) (ret=ErrorCodeToStatus(server_call_noerr(kind))) + +/* helper to make the server functions return STATUS_ codes */ +static NTSTATUS ErrorCodeToStatus (DWORD Error) +{ + TRACE("err=%lu\n", Error); + switch (Error) + { + case NO_ERROR: return STATUS_SUCCESS; + default: + FIXME("Error code %lu not implemented\n", Error); + } + return STATUS_UNSUCCESSFUL; +} + +/* copy a key name into the request buffer */ +static inline NTSTATUS copy_nameU( LPWSTR Dest, PUNICODE_STRING Name ) +{ + if (Name->Buffer) + { + if ((Name->Length) > MAX_PATH) return STATUS_BUFFER_OVERFLOW; + lstrcpyW( Dest, Name->Buffer ); + } + else Dest[0] = 0; + return STATUS_SUCCESS; +} + /* - * Semaphore + * Semaphores */ /****************************************************************************** - * NtCreateSemaphore [NTDLL] + * NtCreateSemaphore */ NTSTATUS WINAPI NtCreateSemaphore( OUT PHANDLE SemaphoreHandle, @@ -27,29 +57,52 @@ IN ULONG InitialCount, IN ULONG MaximumCount) { - FIXME("(%p,0x%08lx,%p(%s),0x%08lx,0x%08lx) stub!\n", - SemaphoreHandle, DesiredAccess, ObjectAttributes, - ObjectAttributes ? debugstr_w(ObjectAttributes->ObjectName->Buffer) : NULL, - InitialCount, MaximumCount); - return 0; + struct create_semaphore_request *req = get_req_buffer(); + HRESULT ret; + + FIXME("(%p,0x%08lx,%p,0x%08lx,0x%08lx) stub!\n", + SemaphoreHandle, DesiredAccess, ObjectAttributes, InitialCount, MaximumCount); + dump_ObjectAttributes(ObjectAttributes); + + if ((MaximumCount <= 0) || (InitialCount < 0) || (InitialCount > MaximumCount)) + return STATUS_INVALID_PARAMETER; + + *SemaphoreHandle = 0; + req->initial = InitialCount; + req->max = MaximumCount; + req->inherit = ObjectAttributes->Attributes & OBJ_INHERIT; + copy_nameU( req->name, ObjectAttributes->ObjectName ); + if (nt_server_call( REQ_CREATE_SEMAPHORE ) != STATUS_SUCCESS) return ret; + *SemaphoreHandle = req->handle; + return ret; } /****************************************************************************** - * NtOpenSemaphore [NTDLL] + * NtOpenSemaphore + * + * FIXME */ NTSTATUS WINAPI NtOpenSemaphore( IN HANDLE SemaphoreHandle, IN ACCESS_MASK DesiredAcces, IN POBJECT_ATTRIBUTES ObjectAttributes) { - FIXME("(0x%08x,0x%08lx,%p(%s)) stub!\n", - SemaphoreHandle, DesiredAcces, ObjectAttributes, - ObjectAttributes ? debugstr_w(ObjectAttributes->ObjectName->Buffer) : NULL); - return 0; + struct open_semaphore_request *req = get_req_buffer(); + HRESULT ret; + + FIXME("(0x%08x,0x%08lx,%p) stub!\n", + SemaphoreHandle, DesiredAcces, ObjectAttributes); + dump_ObjectAttributes(ObjectAttributes); + + req->access = DesiredAcces; + req->inherit = ObjectAttributes->Attributes & OBJ_INHERIT; + copy_nameU( req->name, ObjectAttributes->ObjectName ); + if (nt_server_call( REQ_OPEN_SEMAPHORE ) != STATUS_SUCCESS) return -1; + return req->handle; } /****************************************************************************** - * NtQuerySemaphore [NTDLL] + * NtQuerySemaphore */ NTSTATUS WINAPI NtQuerySemaphore( HANDLE SemaphoreHandle, @@ -60,27 +113,39 @@ { FIXME("(0x%08x,%p,%p,0x%08lx,%p) stub!\n", SemaphoreHandle, SemaphoreInformationClass, SemaphoreInformation, Length, ReturnLength); - return 0; + return STATUS_SUCCESS; } /****************************************************************************** - * NtReleaseSemaphore [NTDLL] + * NtReleaseSemaphore */ NTSTATUS WINAPI NtReleaseSemaphore( IN HANDLE SemaphoreHandle, IN ULONG ReleaseCount, IN PULONG PreviousCount) { + struct release_semaphore_request *req = get_req_buffer(); + HRESULT ret; + FIXME("(0x%08x,0x%08lx,%p,) stub!\n", SemaphoreHandle, ReleaseCount, PreviousCount); - return 0; + + if (ReleaseCount < 0) return STATUS_INVALID_PARAMETER; + + req->handle = SemaphoreHandle; + req->count = ReleaseCount; + if (nt_server_call( REQ_RELEASE_SEMAPHORE ) == STATUS_SUCCESS) + { + if (PreviousCount) *PreviousCount = req->prev_count; + } + return ret; } /* - * Event + * Events */ /************************************************************************** - * NtCreateEvent [NTDLL.71] + * NtCreateEvent */ NTSTATUS WINAPI NtCreateEvent( OUT PHANDLE EventHandle, @@ -89,36 +154,128 @@ IN BOOLEAN ManualReset, IN BOOLEAN InitialState) { - FIXME("(%p,0x%08lx,%p(%s),%08x,%08x): empty stub\n", - EventHandle,DesiredAccess,ObjectAttributes, - ObjectAttributes ? debugstr_w(ObjectAttributes->ObjectName->Buffer) : NULL, - ManualReset,InitialState); - return 0; + struct create_event_request *req = get_req_buffer(); + HRESULT ret; + + FIXME("(%p,0x%08lx,%p,%08x,%08x): empty stub\n", + EventHandle,DesiredAccess,ObjectAttributes,ManualReset,InitialState); + dump_ObjectAttributes(ObjectAttributes); + + *EventHandle = 0; + req->manual_reset = ManualReset; + req->initial_state = InitialState; + req->inherit = ObjectAttributes->Attributes & OBJ_INHERIT; + copy_nameU( req->name, ObjectAttributes->ObjectName ); + if (nt_server_call( REQ_CREATE_EVENT ) != STATUS_SUCCESS) return ret; + *EventHandle = req->handle; + return STATUS_SUCCESS; } /****************************************************************************** - * NtOpenEvent [NTDLL] + * NtOpenEvent */ NTSTATUS WINAPI NtOpenEvent( OUT PHANDLE EventHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes) { - FIXME("(%p,0x%08lx,%p(%s)),stub!\n", - EventHandle,DesiredAccess,ObjectAttributes, - ObjectAttributes ? debugstr_w(ObjectAttributes->ObjectName->Buffer) : NULL); - return 0; + struct open_event_request *req = get_req_buffer(); + HRESULT ret; + + FIXME("(%p,0x%08lx,%p),stub!\n", + EventHandle,DesiredAccess,ObjectAttributes); + dump_ObjectAttributes(ObjectAttributes); + + *EventHandle = 0; + req->access = DesiredAccess; + req->inherit = ObjectAttributes->Attributes & OBJ_INHERIT; + copy_nameU( req->name, ObjectAttributes->ObjectName ); + if (nt_server_call( REQ_OPEN_EVENT ) != STATUS_SUCCESS) return ret; + *EventHandle = req->handle; + return ret; +} + +/*********************************************************************** + * EVENT_Operation + * + * Execute an event operation (set,reset,pulse). + */ +static NTSTATUS EVENT_Operation( + HANDLE handle, + PULONG NumberOfThreadsReleased, + enum event_op op ) +{ + struct event_op_request *req = get_req_buffer(); + HRESULT ret; + + req->handle = handle; + req->op = op; + nt_server_call( REQ_EVENT_OP ); + return ret; } /****************************************************************************** - * NtSetEvent [NTDLL] + * NtSetEvent */ NTSTATUS WINAPI NtSetEvent( IN HANDLE EventHandle, PULONG NumberOfThreadsReleased) { - FIXME("(0x%08x,%p)\n", - EventHandle, NumberOfThreadsReleased); - return 0; + FIXME("(0x%08x,%p)\n", EventHandle, NumberOfThreadsReleased); + + return EVENT_Operation(EventHandle, NumberOfThreadsReleased, SET_EVENT); } +/****************************************************************************** + * NtResetEvent + */ +NTSTATUS WINAPI NtResetEvent( + IN HANDLE EventHandle, + PULONG NumberOfThreadsReleased) +{ + FIXME("(0x%08x,%p)\n", EventHandle, NumberOfThreadsReleased); + + return EVENT_Operation(EventHandle, NumberOfThreadsReleased, RESET_EVENT); +} + +/****************************************************************************** + * NtClearEvent + * + * FIXME + * same as NtResetEvent ??? + */ +NTSTATUS WINAPI NtClearEvent ( + IN HANDLE EventHandle) +{ + FIXME("(0x%08x)\n", EventHandle); + return EVENT_Operation(EventHandle, NULL, RESET_EVENT); +} + +/****************************************************************************** + * NtPulseEvent + * + * FIXME + * PulseCount + */ +NTSTATUS WINAPI NtPulseEvent( + IN HANDLE EventHandle, + IN PULONG PulseCount) +{ + FIXME("(0x%08x,%p)\n", EventHandle, PulseCount); + + return EVENT_Operation(EventHandle, NULL, PULSE_EVENT); +} + +/****************************************************************************** + * NtQueryEvent + */ +NTSTATUS WINAPI NtQueryEvent ( + IN HANDLE EventHandle, + IN UINT EventInformationClass, + OUT PVOID EventInformation, + IN ULONG EventInformationLength, + OUT PULONG ReturnLength) +{ + FIXME("(0x%08x)\n", EventHandle); + return STATUS_SUCCESS; +}
diff --git a/include/ntddk.h b/include/ntddk.h index 1abb28b..787d2ce 100644 --- a/include/ntddk.h +++ b/include/ntddk.h
@@ -10,6 +10,8 @@ #include "winnt.h" #include "winbase.h" /* fixme: should be taken out sometimes */ +#include "pshpack1.h" + #ifdef __cplusplus extern "C" { #endif @@ -30,13 +32,89 @@ typedef VOID (NTAPI *PIO_APC_ROUTINE) ( PVOID ApcContext, PIO_STATUS_BLOCK IoStatusBlock, ULONG Reserved ); -typedef enum _KEY_INFORMATION_CLASS { +/* + registry + */ + + /* key information */ +typedef struct _KEY_BASIC_INFORMATION { + FILETIME LastWriteTime; + ULONG TitleIndex; + ULONG NameLength; + WCHAR Name[1]; +} KEY_BASIC_INFORMATION, *PKEY_BASIC_INFORMATION; + +typedef struct _KEY_NODE_INFORMATION +{ + FILETIME LastWriteTime; + ULONG TitleIndex; + ULONG ClassOffset; + ULONG ClassLength; + ULONG NameLength; + WCHAR Name[1]; +/* Class[1]; */ +} KEY_NODE_INFORMATION, *PKEY_NODE_INFORMATION; + +typedef struct _KEY_FULL_INFORMATION +{ + FILETIME LastWriteTime; + ULONG TitleIndex; + ULONG ClassOffset; + ULONG ClassLength; + ULONG SubKeys; + ULONG MaxNameLen; + ULONG MaxClassLen; + ULONG Values; + ULONG MaxValueNameLen; + ULONG MaxValueDataLen; + WCHAR Class[1]; +} KEY_FULL_INFORMATION, *PKEY_FULL_INFORMATION; + +typedef enum _KEY_INFORMATION_CLASS +{ KeyBasicInformation, KeyNodeInformation, KeyFullInformation } KEY_INFORMATION_CLASS; -typedef enum _KEY_VALUE_INFORMATION_CLASS { +typedef struct _KEY_VALUE_ENTRY +{ + PUNICODE_STRING ValueName; + ULONG DataLength; + ULONG DataOffset; + ULONG Type; +} KEY_VALUE_ENTRY, *PKEY_VALUE_ENTRY; + +/* value information */ +typedef struct _KEY_VALUE_BASIC_INFORMATION +{ + ULONG TitleIndex; + ULONG Type; + ULONG NameLength; + WCHAR Name[1]; +} KEY_VALUE_BASIC_INFORMATION, *PKEY_VALUE_BASIC_INFORMATION; + +typedef struct _KEY_VALUE_FULL_INFORMATION +{ + ULONG TitleIndex; + ULONG Type; + ULONG DataOffset; + ULONG DataLength; + ULONG NameLength; + WCHAR Name[1]; +/* UCHAR Data[1];*/ +} KEY_VALUE_FULL_INFORMATION, *PKEY_VALUE_FULL_INFORMATION; + +typedef struct _KEY_VALUE_PARTIAL_INFORMATION +{ + ULONG TitleIndex; + ULONG Type; + ULONG DataLength; + UCHAR Data[1]; +} KEY_VALUE_PARTIAL_INFORMATION, *PKEY_VALUE_PARTIAL_INFORMATION; + +typedef enum _KEY_VALUE_INFORMATION_CLASS +{ KeyValueBasicInformation, KeyValueFullInformation, KeyValuePartialInformation, @@ -44,6 +122,11 @@ KeyValuePartialInformationAlign64 } KEY_VALUE_INFORMATION_CLASS; +NTSTATUS WINAPI RtlFormatCurrentUserKeyPath( + PUNICODE_STRING KeyPath); + +/* thread information */ + typedef enum _THREADINFOCLASS { ThreadBasicInformation, ThreadTimes, @@ -65,6 +148,8 @@ MaxThreadInfoClass } THREADINFOCLASS; +/* file information */ + typedef enum _FILE_INFORMATION_CLASS { FileDirectoryInformation = 1, FileFullDirectoryInformation, @@ -124,9 +209,8 @@ } SECTION_INHERIT; -/* - placeholder -*/ +/* object information */ + typedef enum _OBJECT_INFORMATION_CLASS { DunnoTheConstants1 @@ -134,9 +218,7 @@ } OBJECT_INFORMATION_CLASS, *POBJECT_INFORMATION_CLASS; -/* - * NtQuerySystemInformation - */ +/* system information */ typedef enum SYSTEM_INFORMATION_CLASS { Unknown1 = 1, @@ -170,6 +252,8 @@ ULONG PeakPagefileUsage; } VM_COUNTERS, *PVM_COUNTERS; +/* process information */ + typedef struct _PROCESS_INFO { DWORD Offset; /* 00 offset to next PROCESS_INFO ok*/ DWORD ThreadCount; /* 04 number of ThreadInfo member ok */ @@ -317,9 +401,7 @@ } TIMER_TYPE; -/* - * token functions - */ +/* token functions */ NTSTATUS WINAPI NtOpenProcessToken( HANDLE ProcessHandle, @@ -347,35 +429,58 @@ DWORD tokeninfolength, LPDWORD retlen ); -/* - * sid functions - */ +/* sid functions */ BOOLEAN WINAPI RtlAllocateAndInitializeSid ( PSID_IDENTIFIER_AUTHORITY pIdentifierAuthority, - DWORD nSubAuthorityCount, - DWORD x3, - DWORD x4, - DWORD x5, - DWORD x6, - DWORD x7, - DWORD x8, - DWORD x9, - DWORD x10, - PSID pSid); + BYTE nSubAuthorityCount, + DWORD nSubAuthority0, DWORD nSubAuthority1, + DWORD nSubAuthority2, DWORD nSubAuthority3, + DWORD nSubAuthority4, DWORD nSubAuthority5, + DWORD nSubAuthority6, DWORD nSubAuthority7, + PSID *pSid ); -DWORD WINAPI RtlEqualSid(DWORD x1,DWORD x2); -DWORD WINAPI RtlFreeSid(DWORD x1); -DWORD WINAPI RtlLengthRequiredSid(DWORD nrofsubauths); -DWORD WINAPI RtlLengthSid(PSID sid); -DWORD WINAPI RtlInitializeSid(PSID PSID,PSID_IDENTIFIER_AUTHORITY PSIDauth, DWORD c); -LPDWORD WINAPI RtlSubAuthoritySid(PSID PSID,DWORD nr); -LPBYTE WINAPI RtlSubAuthorityCountSid(PSID PSID); -DWORD WINAPI RtlCopySid(DWORD len,PSID to,PSID from); +BOOL WINAPI RtlInitializeSid( + PSID pSid, + PSID_IDENTIFIER_AUTHORITY pIdentifierAuthority, + BYTE nSubAuthorityCount); + +DWORD WINAPI RtlFreeSid( + PSID pSid); -/* - * security descriptor functions - */ +BOOL WINAPI RtlEqualSid( + PSID pSid1, + PSID pSid2 ); + +DWORD WINAPI RtlLengthRequiredSid( + DWORD nrofsubauths); + +DWORD WINAPI RtlLengthSid( + PSID sid); + +LPDWORD WINAPI RtlSubAuthoritySid( + PSID PSID, + DWORD nr); + +LPBYTE WINAPI RtlSubAuthorityCountSid( + PSID pSid); + +DWORD WINAPI RtlCopySid( + DWORD len, + PSID to, + PSID from); + +BOOL WINAPI RtlValidSid( + PSID pSid); + +BOOL WINAPI RtlEqualPrefixSid( + PSID pSid1, + PSID pSid2); + +PSID_IDENTIFIER_AUTHORITY WINAPI RtlIdentifierAuthoritySid( + PSID pSid ); + +/* security descriptor functions */ NTSTATUS WINAPI RtlCreateSecurityDescriptor( PSECURITY_DESCRIPTOR lpsd, @@ -431,12 +536,22 @@ PSID *Group, PBOOLEAN GroupDefaulted); -/* ############################## - ###### ACL FUNCTIONS ###### - ############################## -*/ +NTSTATUS WINAPI RtlMakeSelfRelativeSD( + IN PSECURITY_DESCRIPTOR pAbsoluteSecurityDescriptor, + IN PSECURITY_DESCRIPTOR pSelfRelativeSecurityDescriptor, + IN OUT LPDWORD lpdwBufferLength); -DWORD WINAPI RtlCreateAcl(PACL acl,DWORD size,DWORD rev); +NTSTATUS WINAPI RtlGetControlSecurityDescriptor( + PSECURITY_DESCRIPTOR pSecurityDescriptor, + PSECURITY_DESCRIPTOR_CONTROL pControl, + LPDWORD lpdwRevision); + +/* acl functions */ + +NTSTATUS WINAPI RtlCreateAcl( + PACL acl, + DWORD size, + DWORD rev); BOOLEAN WINAPI RtlFirstFreeAce( PACL acl, @@ -449,35 +564,112 @@ PACE_HEADER acestart, DWORD acelen); -DWORD WINAPI RtlAddAccessAllowedAce(DWORD x1,DWORD x2,DWORD x3,DWORD x4); -DWORD WINAPI RtlGetAce(PACL pAcl,DWORD dwAceIndex,LPVOID *pAce ); +BOOL WINAPI RtlAddAccessAllowedAce( + IN OUT PACL pAcl, + IN DWORD dwAceRevision, + IN DWORD AccessMask, + IN PSID pSid); -/* - * string functions - */ +BOOL WINAPI AddAccessAllowedAceEx( + IN OUT PACL pAcl, + IN DWORD dwAceRevision, + IN DWORD AceFlags, + IN DWORD AccessMask, + IN PSID pSid); -DWORD WINAPI RtlAnsiStringToUnicodeString(PUNICODE_STRING uni,PANSI_STRING ansi,BOOLEAN doalloc); -DWORD WINAPI RtlOemStringToUnicodeString(PUNICODE_STRING uni,PSTRING ansi,BOOLEAN doalloc); -DWORD WINAPI RtlMultiByteToUnicodeN(LPWSTR unistr,DWORD unilen,LPDWORD reslen,LPSTR oemstr,DWORD oemlen); -DWORD WINAPI RtlOemToUnicodeN(LPWSTR unistr,DWORD unilen,LPDWORD reslen,LPSTR oemstr,DWORD oemlen); -VOID WINAPI RtlInitAnsiString(PANSI_STRING target,LPCSTR source); -VOID WINAPI RtlInitString(PSTRING target,LPCSTR source); -VOID WINAPI RtlInitUnicodeString(PUNICODE_STRING target,LPCWSTR source); -VOID WINAPI RtlFreeUnicodeString(PUNICODE_STRING str); -VOID WINAPI RtlFreeAnsiString(PANSI_STRING AnsiString); -DWORD WINAPI RtlUnicodeToOemN(LPSTR oemstr,DWORD oemlen,LPDWORD reslen,LPWSTR unistr,DWORD unilen); -DWORD WINAPI RtlUnicodeStringToOemString(PANSI_STRING oem,PUNICODE_STRING uni,BOOLEAN alloc); -DWORD WINAPI RtlUnicodeStringToAnsiString(PANSI_STRING oem,PUNICODE_STRING uni,BOOLEAN alloc); -DWORD WINAPI RtlEqualUnicodeString(PUNICODE_STRING s1,PUNICODE_STRING s2,DWORD x); -DWORD WINAPI RtlUpcaseUnicodeString(PUNICODE_STRING dest,PUNICODE_STRING src,BOOLEAN doalloc); -UINT WINAPI RtlxOemStringToUnicodeSize(PSTRING str); -UINT WINAPI RtlxAnsiStringToUnicodeSize(PANSI_STRING str); -DWORD WINAPI RtlIsTextUnicode(LPVOID buf, DWORD len, DWORD *pf); -NTSTATUS WINAPI RtlCompareUnicodeString(PUNICODE_STRING String1, PUNICODE_STRING String2, BOOLEAN CaseInSensitive); +DWORD WINAPI RtlGetAce( + PACL pAcl, + DWORD dwAceIndex, + LPVOID *pAce ); -/* - * resource functions - */ +/* string functions */ + +VOID WINAPI RtlInitAnsiString( + PANSI_STRING target, + LPCSTR source); + +VOID WINAPI RtlInitString( + PSTRING target, + LPCSTR source); + +VOID WINAPI RtlInitUnicodeString( + PUNICODE_STRING target, + LPCWSTR source); + +VOID WINAPI RtlFreeUnicodeString( + PUNICODE_STRING str); + +VOID WINAPI RtlFreeAnsiString( + PANSI_STRING AnsiString); + +NTSTATUS WINAPI RtlAnsiStringToUnicodeString( + PUNICODE_STRING uni, + PANSI_STRING ansi, + BOOLEAN doalloc); + +NTSTATUS WINAPI RtlOemStringToUnicodeString( + PUNICODE_STRING uni, + PSTRING ansi, + BOOLEAN doalloc); + +NTSTATUS WINAPI RtlMultiByteToUnicodeN( + LPWSTR unistr, + DWORD unilen, + LPDWORD reslen, + LPSTR oemstr, + DWORD oemlen); + +NTSTATUS WINAPI RtlOemToUnicodeN( + LPWSTR unistr, + DWORD unilen, + LPDWORD reslen, + LPSTR oemstr, + DWORD oemlen); + +NTSTATUS WINAPI RtlUnicodeToOemN( + LPSTR oemstr, + DWORD oemlen, + LPDWORD reslen, + LPWSTR unistr, + DWORD unilen); + +NTSTATUS WINAPI RtlUnicodeStringToOemString( + PANSI_STRING oem, + PUNICODE_STRING uni, + BOOLEAN alloc); + +NTSTATUS WINAPI RtlUnicodeStringToAnsiString( + PANSI_STRING oem, + PUNICODE_STRING uni, + BOOLEAN alloc); + +BOOLEAN WINAPI RtlEqualUnicodeString( + PUNICODE_STRING s1, + PUNICODE_STRING s2, + BOOLEAN x); + +DWORD WINAPI RtlUpcaseUnicodeString( + PUNICODE_STRING dest, + PUNICODE_STRING src, + BOOLEAN doalloc); + +UINT WINAPI RtlxOemStringToUnicodeSize( + PSTRING str); + +UINT WINAPI RtlxAnsiStringToUnicodeSize( + PANSI_STRING str); + +DWORD WINAPI RtlIsTextUnicode( + LPVOID buf, + DWORD len, + DWORD *pf); + +NTSTATUS WINAPI RtlCompareUnicodeString( + PUNICODE_STRING String1, + PUNICODE_STRING String2, + BOOLEAN CaseInSensitive); + +/* resource functions */ typedef struct _RTL_RWLOCK { CRITICAL_SECTION rtlCS; @@ -509,9 +701,7 @@ VOID WINAPI RtlDumpResource( LPRTL_RWLOCK); -/* - time functions - */ +/* time functions */ typedef struct _TIME_FIELDS { CSHORT Year; @@ -550,9 +740,7 @@ LPFILETIME ft, LPDWORD timeret); -/* - heap functions -*/ +/* heap functions */ /* Data structure for heap definition. This includes various sizing parameters and callback routines, which, if left NULL, @@ -582,55 +770,114 @@ ULONG Flags, PVOID Address); -/* - * misc - */ -void WINAPIV DbgPrint(LPCSTR fmt, ...); -void WINAPI NtRaiseException(PEXCEPTION_RECORD,PCONTEXT,BOOL); -void WINAPI RtlRaiseException(PEXCEPTION_RECORD); -void WINAPI RtlRaiseStatus(NTSTATUS); -void WINAPI RtlUnwind(PEXCEPTION_FRAME,LPVOID,PEXCEPTION_RECORD,DWORD); +/* exception */ + +void WINAPI NtRaiseException( + PEXCEPTION_RECORD,PCONTEXT,BOOL); + +void WINAPI RtlRaiseException( + PEXCEPTION_RECORD); + +void WINAPI RtlRaiseStatus( + NTSTATUS); + +void WINAPI RtlUnwind( + PEXCEPTION_FRAME, + LPVOID, + PEXCEPTION_RECORD,DWORD); + +/* process environment block */ VOID WINAPI RtlAcquirePebLock(void); VOID WINAPI RtlReleasePebLock(void); + +/* mathematics */ +INT WINAPI RtlExtendedLargeIntegerDivide( + LARGE_INTEGER dividend, + DWORD divisor, + LPDWORD rest); + +LARGE_INTEGER WINAPI RtlExtendedIntegerMultiply( + LARGE_INTEGER factor1, + INT factor2); + +/* environment */ +DWORD WINAPI RtlCreateEnvironment( + DWORD x1, + DWORD x2); + +DWORD WINAPI RtlDestroyEnvironment( + DWORD x); + +DWORD WINAPI RtlQueryEnvironmentVariable_U( + DWORD x1, + PUNICODE_STRING key, + PUNICODE_STRING val) ; + +DWORD WINAPI RtlSetEnvironmentVariable( + DWORD x1, + PUNICODE_STRING key, + PUNICODE_STRING val); + +/* object security */ + +DWORD WINAPI RtlNewSecurityObject( + DWORD x1, + DWORD x2, + DWORD x3, + DWORD x4, + DWORD x5, + DWORD x6); + +DWORD WINAPI RtlDeleteSecurityObject( + DWORD x1); + +NTSTATUS WINAPI +NtQuerySecurityObject( + IN HANDLE Object, + IN SECURITY_INFORMATION RequestedInformation, + OUT PSECURITY_DESCRIPTOR pSecurityDesriptor, + IN ULONG Length, + OUT PULONG ResultLength); + +NTSTATUS WINAPI +NtSetSecurityObject( + IN HANDLE Handle, + IN SECURITY_INFORMATION SecurityInformation, + IN PSECURITY_DESCRIPTOR SecurityDescriptor); + + +/* misc */ + +void WINAPIV DbgPrint(LPCSTR fmt, ...); + DWORD WINAPI RtlAdjustPrivilege(DWORD x1,DWORD x2,DWORD x3,DWORD x4); DWORD WINAPI RtlIntegerToChar(DWORD x1,DWORD x2,DWORD x3,DWORD x4); -DWORD WINAPI RtlSetEnvironmentVariable(DWORD x1,PUNICODE_STRING key,PUNICODE_STRING val); -DWORD WINAPI RtlNewSecurityObject(DWORD x1,DWORD x2,DWORD x3,DWORD x4,DWORD x5,DWORD x6); -DWORD WINAPI RtlDeleteSecurityObject(DWORD x1); LPVOID WINAPI RtlNormalizeProcessParams(LPVOID x); DWORD WINAPI RtlNtStatusToDosError(DWORD error); BOOLEAN WINAPI RtlGetNtProductType(LPDWORD type); -INT WINAPI RtlExtendedLargeIntegerDivide(LARGE_INTEGER dividend, DWORD divisor, LPDWORD rest); -LARGE_INTEGER WINAPI RtlExtendedIntegerMultiply(LARGE_INTEGER factor1,INT factor2); -DWORD WINAPI RtlFormatCurrentUserKeyPath(PUNICODE_STRING String); -DWORD WINAPI RtlOpenCurrentUser(DWORD x1, DWORD *x2); -BOOLEAN WINAPI RtlDosPathNameToNtPathName_U( LPWSTR from,PUNICODE_STRING us,DWORD x2,DWORD x3); -DWORD WINAPI RtlCreateEnvironment(DWORD x1,DWORD x2); -DWORD WINAPI RtlDestroyEnvironment(DWORD x); -DWORD WINAPI RtlQueryEnvironmentVariable_U(DWORD x1,PUNICODE_STRING key,PUNICODE_STRING val) ; -BOOL WINAPI IsValidSid(PSID); -BOOL WINAPI EqualSid(PSID,PSID); -BOOL WINAPI EqualPrefixSid(PSID,PSID); -DWORD WINAPI GetSidLengthRequired(BYTE); -BOOL WINAPI AllocateAndInitializeSid(PSID_IDENTIFIER_AUTHORITY,BYTE,DWORD, - DWORD,DWORD,DWORD,DWORD,DWORD,DWORD, - DWORD,PSID*); -VOID* WINAPI FreeSid(PSID); -BOOL WINAPI InitializeSecurityDescriptor(SECURITY_DESCRIPTOR*,DWORD); -BOOL WINAPI InitializeSid(PSID,PSID_IDENTIFIER_AUTHORITY,BYTE); -DWORD* WINAPI GetSidSubAuthority(PSID,DWORD); -BYTE * WINAPI GetSidSubAuthorityCount(PSID); -DWORD WINAPI GetLengthSid(PSID); -BOOL WINAPI CopySid(DWORD,PSID,PSID); -BOOL WINAPI LookupAccountSidA(LPCSTR,PSID,LPCSTR,LPDWORD,LPCSTR,LPDWORD, - PSID_NAME_USE); -BOOL WINAPI LookupAccountSidW(LPCWSTR,PSID,LPCWSTR,LPDWORD,LPCWSTR,LPDWORD, - PSID_NAME_USE); -PSID_IDENTIFIER_AUTHORITY WINAPI GetSidIdentifierAuthority(PSID); +DWORD WINAPI RtlOpenCurrentUser( + IN ACCESS_MASK DesiredAccess, + OUT PHANDLE KeyHandle); + +BOOLEAN WINAPI RtlDosPathNameToNtPathName_U( LPWSTR from,PUNICODE_STRING us,DWORD x2,DWORD x3); +BOOL WINAPI RtlImpersonateSelf(SECURITY_IMPERSONATION_LEVEL ImpersonationLevel); + +NTSTATUS WINAPI +NtAccessCheck( + IN PSECURITY_DESCRIPTOR SecurityDescriptor, + IN HANDLE ClientToken, + IN ACCESS_MASK DesiredAccess, + IN PGENERIC_MAPPING GenericMapping, + OUT PPRIVILEGE_SET PrivilegeSet, + OUT PULONG ReturnLength, + OUT PULONG GrantedAccess, + OUT PBOOLEAN AccessStatus); #ifdef __cplusplus } #endif +#include "poppack.h" + #endif
diff --git a/include/ntdef.h b/include/ntdef.h index dc07f68..edf0af8 100644 --- a/include/ntdef.h +++ b/include/ntdef.h
@@ -4,6 +4,8 @@ #include "basetsd.h" #include "windef.h" +#include "pshpack1.h" + #ifdef __cplusplus extern "C" { #endif @@ -80,8 +82,20 @@ typedef OBJECT_ATTRIBUTES *POBJECT_ATTRIBUTES; +#define InitializeObjectAttributes(p,n,a,r,s) \ +{ (p)->Length = sizeof(OBJECT_ATTRIBUTES); \ + (p)->RootDirectory = r; \ + (p)->Attributes = a; \ + (p)->ObjectName = n; \ + (p)->SecurityDescriptor = s; \ + (p)->SecurityQualityOfService = NULL; \ +} + + #ifdef __cplusplus } #endif +#include "poppack.h" + #endif
diff --git a/include/ntsecapi.h b/include/ntsecapi.h index 44fa0b5..473da89 100644 --- a/include/ntsecapi.h +++ b/include/ntsecapi.h
@@ -32,6 +32,22 @@ PolicyDnsDomainInformation } POLICY_INFORMATION_CLASS, *PPOLICY_INFORMATION_CLASS; +typedef ULONG POLICY_AUDIT_EVENT_OPTIONS, *PPOLICY_AUDIT_EVENT_OPTIONS; + +typedef struct +{ + BOOLEAN AuditingMode; + PPOLICY_AUDIT_EVENT_OPTIONS EventAuditingOptions; + ULONG MaximumAuditEventCount; +} POLICY_AUDIT_EVENTS_INFO, *PPOLICY_AUDIT_EVENTS_INFO; + +typedef struct +{ + LSA_UNICODE_STRING Name; + PSID Sid; +} POLICY_PRIMARY_DOMAIN_INFO, *PPOLICY_PRIMARY_DOMAIN_INFO; + + NTSTATUS WINAPI LsaQueryInformationPolicy(LSA_HANDLE,POLICY_INFORMATION_CLASS,PVOID*); NTSTATUS WINAPI LsaFreeMemory(PVOID);
diff --git a/include/winbase.h b/include/winbase.h index 79c4500..d35dc77 100644 --- a/include/winbase.h +++ b/include/winbase.h
@@ -1374,12 +1374,15 @@ LONG WINAPI InterlockedExchange(LPLONG,LONG); LONG WINAPI InterlockedExchangeAdd(PLONG,LONG); LONG WINAPI InterlockedIncrement(LPLONG); -BOOL WINAPI IsDBCSLeadByteEx(UINT,BYTE); -BOOL WINAPI IsProcessorFeaturePresent(DWORD); -BOOL WINAPI IsValidLocale(DWORD,DWORD); -BOOL WINAPI LocalFileTimeToFileTime(const FILETIME*,LPFILETIME); -BOOL WINAPI LockFile(HANDLE,DWORD,DWORD,DWORD,DWORD); -BOOL WINAPI LockFileEx(HANDLE, DWORD, DWORD, DWORD, DWORD, LPOVERLAPPED); +BOOL WINAPI IsDBCSLeadByteEx(UINT,BYTE); +BOOL WINAPI IsProcessorFeaturePresent(DWORD); +BOOL WINAPI IsValidLocale(DWORD,DWORD); +BOOL WINAPI LookupAccountSidA(LPCSTR,PSID,LPSTR,LPDWORD,LPSTR,LPDWORD,PSID_NAME_USE); +BOOL WINAPI LookupAccountSidW(LPCWSTR,PSID,LPWSTR,LPDWORD,LPWSTR,LPDWORD,PSID_NAME_USE); +#define LookupAccountSid WINELIB_NAME_AW(LookupAccountSidW) +BOOL WINAPI LocalFileTimeToFileTime(const FILETIME*,LPFILETIME); +BOOL WINAPI LockFile(HANDLE,DWORD,DWORD,DWORD,DWORD); +BOOL WINAPI LockFileEx(HANDLE, DWORD, DWORD, DWORD, DWORD, LPOVERLAPPED); BOOL WINAPI LookupPrivilegeValueA(LPCSTR,LPCSTR,LPVOID); BOOL WINAPI LookupPrivilegeValueW(LPCWSTR,LPCWSTR,LPVOID); #define LookupPrivilegeValue WINELIB_NAME_AW(LookupPrivilegeValue)