1import sys
2from typing import Any, Union, Tuple, Optional, overload, Dict, NoReturn, Sequence
3
4if sys.version_info >= (3, 8):
5    from typing import Literal
6else:
7    from typing_extensions import Literal
8
9CREATE_NEW_CONSOLE: int
10CREATE_NEW_PROCESS_GROUP: int
11DUPLICATE_CLOSE_SOURCE: int
12DUPLICATE_SAME_ACCESS: int
13ERROR_ALREADY_EXISTS: int
14ERROR_BROKEN_PIPE: int
15ERROR_IO_PENDING: int
16ERROR_MORE_DATA: int
17ERROR_NETNAME_DELETED: int
18ERROR_NO_DATA: int
19ERROR_NO_SYSTEM_RESOURCES: int
20ERROR_OPERATION_ABORTED: int
21ERROR_PIPE_BUSY: int
22ERROR_PIPE_CONNECTED: int
23ERROR_SEM_TIMEOUT: int
24FILE_FLAG_FIRST_PIPE_INSTANCE: int
25FILE_FLAG_OVERLAPPED: int
26FILE_GENERIC_READ: int
27FILE_GENERIC_WRITE: int
28GENERIC_READ: int
29GENERIC_WRITE: int
30INFINITE: int
31NMPWAIT_WAIT_FOREVER: int
32NULL: int
33OPEN_EXISTING: int
34PIPE_ACCESS_DUPLEX: int
35PIPE_ACCESS_INBOUND: int
36PIPE_READMODE_MESSAGE: int
37PIPE_TYPE_MESSAGE: int
38PIPE_UNLIMITED_INSTANCES: int
39PIPE_WAIT: int
40PROCESS_ALL_ACCESS: int
41PROCESS_DUP_HANDLE: int
42STARTF_USESHOWWINDOW: int
43STARTF_USESTDHANDLES: int
44STD_ERROR_HANDLE: int
45STD_INPUT_HANDLE: int
46STD_OUTPUT_HANDLE: int
47STILL_ACTIVE: int
48SW_HIDE: int
49WAIT_ABANDONED_0: int
50WAIT_OBJECT_0: int
51WAIT_TIMEOUT: int
52
53def CloseHandle(handle: int) -> None: ...
54
55@overload
56def ConnectNamedPipe(handle: int, overlapped: Literal[True]) -> Overlapped: ...
57@overload
58def ConnectNamedPipe(handle: int, overlapped: Literal[False] = ...) -> None: ...
59@overload
60def ConnectNamedPipe(handle: int, overlapped: bool) -> Any: ...
61
62def CreateFile(file_name: str, desired_access: int, share_mode: int, security_attributes: int, creation_disposition: int, flags_and_attributes: int, template_file: int) -> int: ...
63def CreateJunction(src_path: str, dest_path: str) -> None: ...
64def CreateNamedPipe(name: str, open_mode: int, pipe_mode: int, max_instances: int, out_buffer_size: int, in_buffer_size: int, default_timeout: int, security_attributes: int) -> int: ...
65def CreatePipe(pipe_attrs: Any, size: int) -> Tuple[int, int]: ...
66def CreateProcess(application_name: Optional[str], command_line: Optional[str], proc_attrs: Any, thread_attrs: Any, inherit_handles: bool, creation_flags: int, env_mapping: Dict[str, str], cwd: Optional[str], startup_info: Any) -> Tuple[int, int, int, int]: ...
67def DuplicateHandle(source_process_handle: int, source_handle: int, target_process_handle: int, desired_access: int, inherit_handle: bool, options: int = ...) -> int: ...
68def ExitProcess(ExitCode: int) -> NoReturn: ...
69def GetACP() -> int: ...
70def GetFileType(handle: int) -> int: ...
71def GetCurrentProcess() -> int: ...
72def GetExitCodeProcess(process: int) -> int: ...
73def GetLastError() -> int: ...
74def GetModuleFileName(module_handle: int) -> str: ...
75def GetStdHandle(std_handle: int) -> int: ...
76def GetVersion() -> int: ...
77def OpenProcess(desired_access: int, inherit_handle: bool, process_id: int) -> int: ...
78def PeekNamedPipe(handle: int, size: int = ...) -> Union[Tuple[int, int], Tuple[bytes, int, int]]: ...
79
80# TODO: once literal types are supported, overload with Literal[True/False]
81@overload
82def ReadFile(handle: int, size: int, overlapped: Union[int, bool]) -> Any: ...
83@overload
84def ReadFile(handle: int, size: int) -> Tuple[int, int]: ...
85
86def SetNamedPipeHandleState(named_pipe: int, mode: Optional[int], max_collection_count: Optional[int], collect_data_timeout: Optional[int]) -> None: ...
87def TerminateProcess(handle: int, exit_code: int) -> None: ...
88def WaitForMultipleObjects(handle_seq: Sequence[int], wait_flag: bool, milliseconds: int = ...) -> int: ...
89def WaitForSingleObject(handle: int, milliseconds: int) -> int: ...
90def WaitNamedPipe(name: str, timeout: int) -> None: ...
91
92# TODO: once literal types are supported, overload with Literal[True/False]
93@overload
94def WriteFile(handle: int, buffer: bytes, overlapped: Union[int, bool]) -> Any: ...
95@overload
96def WriteFile(handle: int, buffer: bytes) -> Tuple[bytes, int]: ...
97
98
99class Overlapped:
100    event: int = ...
101    def GetOverlappedResult(self, wait: bool) -> Tuple[int, int]: ...
102    def cancel(self) -> None: ...
103    def getbuffer(self) -> Optional[bytes]: ...
104