| // Copyright 2023 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| #include <windows.h> |
| #include <winternl.h> |
| |
| int main(int argc, char **argv) { |
| if (argc < 3) { |
| return 1; |
| } |
| // Exhaust the inline slots used by TlsAlloc. Loader-provided |
| // static TLS uses a separate index space and must still work. |
| for (int i = 0; i < 65; i++) { |
| TlsAlloc(); |
| } |
| |
| PNT_TIB tib = (PNT_TIB)NtCurrentTeb(); |
| void *arbitrary_user_pointer = &arbitrary_user_pointer; |
| tib->ArbitraryUserPointer = arbitrary_user_pointer; |
| |
| HMODULE hlib = LoadLibrary(argv[1]); |
| if (hlib == NULL) { |
| return 2; |
| } |
| FARPROC proc = GetProcAddress(hlib, argv[2]); |
| if (proc == NULL) { |
| return 3; |
| } |
| if (proc() != 42) { |
| return 4; |
| } |
| if (tib->ArbitraryUserPointer != arbitrary_user_pointer) { |
| return 5; |
| } |
| return 0; |
| } |