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...