static void test_LsaLookupNames2(void) { static const WCHAR n1[] = {'L','O','C','A','L',' ','S','E','R','V','I','C','E'}; static const WCHAR n2[] = {'N','T',' ','A','U','T','H','O','R','I','T','Y','\\','L','o','c','a','l','S','e','r','v','i','c','e'}; NTSTATUS status; LSA_HANDLE handle; LSA_OBJECT_ATTRIBUTES attrs; PLSA_REFERENCED_DOMAIN_LIST domains; PLSA_TRANSLATED_SID2 sids; LSA_UNICODE_STRING name[3]; LPSTR account, sid_dom; if (!pLsaLookupNames2) { win_skip("LsaLookupNames2 not avaliable\n"); return; } if (PRIMARYLANGID(LANGIDFROMLCID(GetThreadLocale())) != LANG_ENGLISH) { skip("Non-english locale (skipping LsaLookupNames2 tests)\n"); return; } memset(&attrs, 0, sizeof(attrs)); attrs.Length = sizeof(attrs); status = pLsaOpenPolicy(NULL, &attrs, POLICY_ALL_ACCESS, &handle); ok(status == STATUS_SUCCESS || status == STATUS_ACCESS_DENIED, "LsaOpenPolicy(POLICY_ALL_ACCESS) returned 0x%08x\n", status); /* try a more restricted access mask if necessary */ if (status == STATUS_ACCESS_DENIED) { trace("LsaOpenPolicy(POLICY_ALL_ACCESS) failed, trying POLICY_VIEW_LOCAL_INFORMATION\n"); status = pLsaOpenPolicy(NULL, &attrs, POLICY_LOOKUP_NAMES, &handle); ok(status == STATUS_SUCCESS, "LsaOpenPolicy(POLICY_VIEW_LOCAL_INFORMATION) returned 0x%08x\n", status); } if (status != STATUS_SUCCESS) { skip("Cannot acquire policy handle\n"); return; } name[0].Buffer = HeapAlloc(GetProcessHeap(), 0, sizeof(n1)); name[0].Length = name[0].MaximumLength = sizeof(n1); memcpy(name[0].Buffer, n1, sizeof(n1)); name[1].Buffer = HeapAlloc(GetProcessHeap(), 0, sizeof(n1)); name[1].Length = name[1].MaximumLength = sizeof(n1) - sizeof(WCHAR); memcpy(name[1].Buffer, n1, sizeof(n1) - sizeof(WCHAR)); name[2].Buffer = HeapAlloc(GetProcessHeap(), 0, sizeof(n2)); name[2].Length = name[2].MaximumLength = sizeof(n2); memcpy(name[2].Buffer, n2, sizeof(n2)); /* account name only */ sids = NULL; domains = NULL; status = pLsaLookupNames2(handle, 0, 1, &name[0], &domains, &sids); ok(status == STATUS_SUCCESS, "expected STATUS_SUCCESS, got %x)\n", status); ok(sids[0].Use == SidTypeWellKnownGroup, "expected SidTypeWellKnownGroup, got %u\n", sids[0].Use); ok(sids[0].Flags == 0, "expected 0, got 0x%08x\n", sids[0].Flags); ok(domains->Entries == 1, "expected 1, got %u\n", domains->Entries); get_sid_info(sids[0].Sid, &account, &sid_dom); ok(!strcmp(account, "LOCAL SERVICE"), "expected \"LOCAL SERVICE\", got \"%s\"\n", account); ok(!strcmp(sid_dom, "NT AUTHORITY"), "expected \"NT AUTHORITY\", got \"%s\"\n", sid_dom); pLsaFreeMemory(sids); pLsaFreeMemory(domains); /* unknown account name */ sids = NULL; domains = NULL; status = pLsaLookupNames2(handle, 0, 1, &name[1], &domains, &sids); ok(status == STATUS_NONE_MAPPED, "expected STATUS_NONE_MAPPED, got %x)\n", status); ok(sids[0].Use == SidTypeUnknown, "expected SidTypeUnknown, got %u\n", sids[0].Use); ok(sids[0].Flags == 0, "expected 0, got 0x%08x\n", sids[0].Flags); ok(domains->Entries == 0, "expected 0, got %u\n", domains->Entries); pLsaFreeMemory(sids); pLsaFreeMemory(domains); /* account + domain */ sids = NULL; domains = NULL; status = pLsaLookupNames2(handle, 0, 1, &name[2], &domains, &sids); ok(status == STATUS_SUCCESS, "expected STATUS_SUCCESS, got %x)\n", status); ok(sids[0].Use == SidTypeWellKnownGroup, "expected SidTypeWellKnownGroup, got %u\n", sids[0].Use); ok(sids[0].Flags == 0, "expected 0, got 0x%08x\n", sids[0].Flags); ok(domains->Entries == 1, "expected 1, got %u\n", domains->Entries); get_sid_info(sids[0].Sid, &account, &sid_dom); ok(!strcmp(account, "LOCAL SERVICE"), "expected \"LOCAL SERVICE\", got \"%s\"\n", account); ok(!strcmp(sid_dom, "NT AUTHORITY"), "expected \"NT AUTHORITY\", got \"%s\"\n", sid_dom); pLsaFreeMemory(sids); pLsaFreeMemory(domains); /* all three */ sids = NULL; domains = NULL; status = pLsaLookupNames2(handle, 0, 3, name, &domains, &sids); ok(status == STATUS_SOME_NOT_MAPPED, "expected STATUS_SOME_NOT_MAPPED, got %x)\n", status); ok(sids[0].Use == SidTypeWellKnownGroup, "expected SidTypeWellKnownGroup, got %u\n", sids[0].Use); ok(sids[1].Use == SidTypeUnknown, "expected SidTypeUnknown, got %u\n", sids[0].Use); ok(sids[2].Use == SidTypeWellKnownGroup, "expected SidTypeWellKnownGroup, got %u\n", sids[0].Use); ok(sids[0].DomainIndex == 0, "expected 0, got %u\n", sids[0].DomainIndex); ok(domains->Entries == 1, "expected 1, got %u\n", domains->Entries); pLsaFreeMemory(sids); pLsaFreeMemory(domains); HeapFree(GetProcessHeap(), 0, name[0].Buffer); HeapFree(GetProcessHeap(), 0, name[1].Buffer); HeapFree(GetProcessHeap(), 0, name[2].Buffer); status = pLsaClose(handle); ok(status == STATUS_SUCCESS, "LsaClose() failed, returned 0x%08x\n", status); }
int main(int argc, char *argv[]) { int fd; int opt; int ret; int i; char tmp_buf[16]; bin_name = basename(argv[0]); fd = open(SID_DEVICE, O_RDONLY); if (fd < 0) { fprintf(stderr, "Failed to open %s.\n", SID_DEVICE); exit(EXIT_FAILURE); } ret = get_sid_info(fd); if (ret < 0) { close(fd); exit(EXIT_FAILURE); } for (i = 0; i < sid_channels; i++) print_ch[i] = 1; enable_print_index = 0; sample_rate = 0; nr_sample = 0; while ((opt = getopt(argc, argv, "c:iuv")) != -1) { switch (opt) { case 'c': if (parse_channel_options(optarg) < 0) { close(fd); exit(EXIT_FAILURE); } break; case 'i': enable_print_index = 1; break; case 'v': printf("%s %s\n", bin_name, VERSION); close(fd); exit(EXIT_SUCCESS); case 'u': case '?': usage(stdout); close(fd); exit(EXIT_SUCCESS); default: usage(stderr); close(fd); exit(EXIT_FAILURE); } } for (; optind < argc; optind++) { if (!sample_rate) sample_rate = strtoul(argv[optind], NULL, 0); else if (!nr_sample) nr_sample = strtoul(argv[optind], NULL, 0); } if (!sample_rate) { usage(stdout); close(fd); exit(EXIT_SUCCESS); } if (!nr_sample) nr_sample = sample_rate; sprintf(tmp_buf, "%u", nr_sample); nr_sample_digits = strlen(tmp_buf); ret = check_arg(fd); if (ret < 0) { close(fd); exit(EXIT_FAILURE); } ret = print_ad(fd); if (ret < 0) { close(fd); exit(EXIT_FAILURE); } close(fd); exit(EXIT_SUCCESS); }