Hi,
Taking the advice of Ivan, I downloaded the beta of Visual C++ 2005 to see how far it could work in Wine, and these are the results:
# wine vcsetup.exe fixme:ver:RtlVerifyVersionInfo (0x406df40c,64,180000): Not all cases correctly implemented yet fixme:ole:CoInitializeSecurity ((nil),-1,(nil),(nil),0,3,(nil),0,(nil)) - stub! fixme:netapi32:NetUserModalsGet (null) 2 0x406df394
Then an error message pops up stating that "a problem has been encountered while loading components" and then it exits.
Looking into netapi32/access.c, NetUserModalsGet is a stub and returns NERR_InternalError by default. I think vcsetup is requiring this call to succeed so it bails out because of the error.
Reading the trace and the msdn docs about NetUserModalsGet, vcsetup is calling with the level parameter == 2 so it is requesting the domain name and identifier.
With the included patch, I have stubbed the structure of the 4 levels that can be queried, but I haven't written the code to handle them yet. If anyone has any information or links that will enlighten me about netapi32 or anything pertaining to this matter, I would greatly appreciate it.
quote from MSDN: "The NetUserModalsGet function retrieves global information for all users and global groups in the security database, which is the security accounts manager (SAM) database or, in the case of domain controllers, the Active Directory."
Does wine have a security accounts manager or an Active Directory?
On Sat, 31 Jul 2004, James Hawkins wrote:
Looking into netapi32/access.c, NetUserModalsGet is a stub and returns NERR_InternalError by default. I think vcsetup is requiring this call to succeed so it bails out because of the error.
Reading the trace and the msdn docs about NetUserModalsGet, vcsetup is calling with the level parameter == 2 so it is requesting the domain name and identifier.
With the included patch, I have stubbed the structure of the 4 levels that can be queried, but I haven't written the code to handle them yet. If anyone has any information or links that will enlighten me about netapi32 or anything pertaining to this matter, I would greatly appreciate it.
I see [1] you've tried to implement the case of NetUserModalsGet() functionality where level == 2, also. Thanks, I need it, too. AFAIK it would suffice only to copy information pointed by the *PPOLICY_PRIMARY_DOMAIN_INFO struct to the *PUSER_MODALS_INFO_2 struct for that, while you have done something very complex IMHO:
-NET_API_STATUS WINAPI NetUserModalsGet(LPCWSTR szServer, DWORD level, LPBYTE *pbuffer) +NET_API_STATUS WINAPI NetUserModalsGet(LPCWSTR server, DWORD level, LPBYTE *bufptr) + ... + PPOLICY_ACCOUNT_DOMAIN_INFO domainInfo; + PSID domainIdentifier; + ... + domainNameLen = lstrlenW(domainInfo->DomainName.Buffer) + 1; + ... + NetApiBufferAllocate(domainNameLen * sizeof(WCHAR) + sizeof(PSID), (LPVOID *)bufptr); + + umi = (USER_MODALS_INFO_2 *) *bufptr; + umi->usrmod2_domain_name = (LPWSTR) (*bufptr + sizeof(USER_MODALS_INFO_2)); + umi->usrmod2_domain_id = (PSID) ( + ((PBYTE) umi->usrmod2_domain_name) + domainNameLen * sizeof(WCHAR)); + + lstrcpynW(umi->usrmod2_domain_name, domainInfo->DomainName.Buffer, domainNameLen); + + CopySid(sizeof(umi->usrmod2_domain_id), + umi->usrmod2_domain_id, domainIdentifier);
AFAICS:
1, there is big memory block allocated during the call to a NetApiBufferAllocate(). What for? Why just not use a size of a USER_MODALS_INFO_2 ?
And yes, then you need to allocate the space twice more - for a string and for the new SID copy.
2, maybe you want to allocate all needed space using a single buffer? Then what does this size mean: "domainNameLen * sizeof(WCHAR) + sizeof(PSID)" ?
3, the domainIdentifier variable is left uninitialized.
Does the patch work for you? I know, instead of asking I should sit down and just write some additional tests for the netapi32.dll.
What I cannot decide myself here (after having read the MSDN docs) is the responsibility for freeing memory blocks, one allocated for the unicode string (usrmod2_domain_name) and another one to hold the copy of SID (usrmod2_domain_id).
MSDN tells only to free the memory allocated for the buffer (pointed by the *bufptr). Every sample of C code on the net I've found which calls NetUserModalsGet() (and where the buffer contains some pointers by itself: USER_MODALS_INFO_1, USER_MODALS_INFO_2) isn't freeing those internal pointers: [2], [3], [4].
Does this mean the code (caller) leaks memory or it's just some automagic used on the system side (callee) to free the memory (on real Windows) later?
quote from MSDN: "The NetUserModalsGet function retrieves global information for all users and global groups in the security database, which is the security accounts manager (SAM) database or, in the case of domain controllers, the Active Directory."
Does wine have a security accounts manager or an Active Directory?
Good q. Will someone answer it, please?
[1] http://www.winehq.org/hypermail/wine-patches/2004/08/0003.html [2] http://www.faqchest.com/msdn/ATL/atl-99/atl-9901/atl-990100/atl99012521_1984... [3] http://66.102.11.104/search?q=cache:www.ntdev.org/archive/ntdev9807/msg0256.... [4] http://66.102.11.104/search?q=cache:pintday.org/downloads/enum_tar.gz+NetUse...
Saulius Krasuckas wrote:
Does wine have a security accounts manager or an Active Directory?
Good q. Will someone answer it, please?
Wine does not implement any security APIs beyond the stubs needed for apps to work, it delegates security to the host system. Active Directory is not really in scope for Wine, that's more a Samba project, though we'll need to co-operate with them on it at some point (for instance COM can use Active Directory).
thanks -mike