authorgravatar for emekankurumeh@outlook.comemekoi <emekankurumeh@outlook.com> 2018-09-27 00:18:47-05:00
committergravatar for emekankurumeh@outlook.comemekoi <emekankurumeh@outlook.com> 2018-09-30 01:05:13-05:00
logd3bf2671362b1b4550369316b7259d55d98c80cc
tree601801ebc912f95d0eaecb9968a79b3717fcbf62
parent1428ef3b07eba5a414b30973b117f3c8328c727c

added dynamic library loading for windows


3 files changed, 55 insertions(+), 19 deletions(-)

std/dynamic_library.zig+36-3
......@@ -1,10 +1,19 @@
1const std = @import("index.zig");
1const builtin = @import("builtin");
2const Os = builtin.Os;
3const std = @import("std");
24const mem = std.mem;
35const elf = std.elf;
46const cstr = std.cstr;
57const linux = std.os.linux;
8const windows = std.os.windows;
69
7pub const DynLib = struct {
10pub const DynLib = switch (builtin.os) {
11 Os.linux => LinuxDynLib,
12 Os.windows => WindowsDynLib,
13 else => void,
14};
15
16pub const LinuxDynLib = struct {
817 allocator: *mem.Allocator,
918 elf_lib: ElfLib,
1019 fd: i32,
......@@ -107,7 +116,7 @@ pub const ElfLib = struct {
107116 }
108117 }
109118
110 return ElfLib{
119 return ElfLib {
111120 .base = base,
112121 .strings = maybe_strings orelse return error.ElfStringSectionNotFound,
113122 .syms = maybe_syms orelse return error.ElfSymSectionNotFound,
......@@ -154,3 +163,27 @@ fn checkver(def_arg: *elf.Verdef, vsym_arg: i32, vername: []const u8, strings: [
154163 const aux = @intToPtr(*elf.Verdaux, @ptrToInt(def) + def.vd_aux);
155164 return mem.eql(u8, vername, cstr.toSliceConst(strings + aux.vda_name));
156165}
166
167pub const WindowsDynLib = struct {
168 allocator: *mem.Allocator,
169 dll: windows.HMODULE,
170
171 pub fn open(allocator: *mem.Allocator, path: []const u8) !WindowsDynLib {
172 const wpath = try std.unicode.utf8ToUtf16LeWithNull(allocator, path);
173 defer allocator.free(wpath);
174
175 return WindowsDynLib {
176 .allocator = allocator,
177 .dll = windows.LoadLibraryW(wpath[0..].ptr) orelse return error.FileNotFound
178 };
179 }
180
181 pub fn close(self: *WindowsDynLib) void {
182 _ = windows.FreeLibrary(self.dll);
183 self.* = undefined;
184 }
185
186 pub fn lookup(self: *WindowsDynLib, name: []const u8) ?usize {
187 return @ptrToInt(windows.GetProcAddress(self.dll, name.ptr));
188 }
189};
std/os/windows/index.zig+1
......@@ -24,6 +24,7 @@ pub const HANDLE = *c_void;
2424pub const HCRYPTPROV = ULONG_PTR;
2525pub const HINSTANCE = *@OpaqueType();
2626pub const HMODULE = *@OpaqueType();
27pub const FARPROC = *@OpaqueType();
2728pub const INT = c_int;
2829pub const LPBYTE = *BYTE;
2930pub const LPCH = *CHAR;
std/os/windows/kernel32.zig+18-16
......@@ -4,10 +4,10 @@ pub extern "kernel32" stdcallcc fn CancelIoEx(hFile: HANDLE, lpOverlapped: LPOVE
44
55pub extern "kernel32" stdcallcc fn CloseHandle(hObject: HANDLE) BOOL;
66
7pub extern "kernel32" stdcallcc fn CreateDirectoryW(lpPathName: [*]const u16, lpSecurityAttributes: ?*SECURITY_ATTRIBUTES) BOOL;
7pub extern "kernel32" stdcallcc fn CreateDirectoryW(lpPathName: LPCWSTR, lpSecurityAttributes: ?*SECURITY_ATTRIBUTES) BOOL;
88
99pub extern "kernel32" stdcallcc fn CreateFileW(
10 lpFileName: [*]const u16, // TODO null terminated pointer type
10 lpFileName: LPCWSTR, // TODO null terminated pointer type
1111 dwDesiredAccess: DWORD,
1212 dwShareMode: DWORD,
1313 lpSecurityAttributes: ?LPSECURITY_ATTRIBUTES,
......@@ -36,21 +36,21 @@ pub extern "kernel32" stdcallcc fn CreateProcessW(
3636 lpProcessInformation: *PROCESS_INFORMATION,
3737) BOOL;
3838
39pub extern "kernel32" stdcallcc fn CreateSymbolicLinkW(lpSymlinkFileName: [*]const u16, lpTargetFileName: [*]const u16, dwFlags: DWORD) BOOLEAN;
39pub extern "kernel32" stdcallcc fn CreateSymbolicLinkW(lpSymlinkFileName: LPCWSTR, lpTargetFileName: LPCWSTR, dwFlags: DWORD) BOOLEAN;
4040
4141pub extern "kernel32" stdcallcc fn CreateIoCompletionPort(FileHandle: HANDLE, ExistingCompletionPort: ?HANDLE, CompletionKey: ULONG_PTR, NumberOfConcurrentThreads: DWORD) ?HANDLE;
4242
4343pub extern "kernel32" stdcallcc fn CreateThread(lpThreadAttributes: ?LPSECURITY_ATTRIBUTES, dwStackSize: SIZE_T, lpStartAddress: LPTHREAD_START_ROUTINE, lpParameter: ?LPVOID, dwCreationFlags: DWORD, lpThreadId: ?LPDWORD) ?HANDLE;
4444
45pub extern "kernel32" stdcallcc fn DeleteFileW(lpFileName: [*]const u16) BOOL;
45pub extern "kernel32" stdcallcc fn DeleteFileW(lpFileName: LPCWSTR) BOOL;
4646
4747pub extern "kernel32" stdcallcc fn ExitProcess(exit_code: UINT) noreturn;
4848
49pub extern "kernel32" stdcallcc fn FindFirstFileW(lpFileName: [*]const u16, lpFindFileData: *WIN32_FIND_DATAW) HANDLE;
49pub extern "kernel32" stdcallcc fn FindFirstFileW(lpFileName: LPCWSTR, lpFindFileData: *WIN32_FIND_DATAW) HANDLE;
5050pub extern "kernel32" stdcallcc fn FindClose(hFindFile: HANDLE) BOOL;
5151pub extern "kernel32" stdcallcc fn FindNextFileW(hFindFile: HANDLE, lpFindFileData: *WIN32_FIND_DATAW) BOOL;
5252
53pub extern "kernel32" stdcallcc fn FreeEnvironmentStringsA(penv: [*]u8) BOOL;
53pub extern "kernel32" stdcallcc fn FreeEnvironmentStringsA(penv: LPSTR) BOOL;
5454
5555pub extern "kernel32" stdcallcc fn GetCommandLineA() LPSTR;
5656
......@@ -63,7 +63,7 @@ pub extern "kernel32" stdcallcc fn GetCurrentDirectoryW(nBufferLength: DWORD, lp
6363pub extern "kernel32" stdcallcc fn GetCurrentThread() HANDLE;
6464pub extern "kernel32" stdcallcc fn GetCurrentThreadId() DWORD;
6565
66pub extern "kernel32" stdcallcc fn GetEnvironmentStringsA() ?[*]u8;
66pub extern "kernel32" stdcallcc fn GetEnvironmentStringsA() ?LPSTR;
6767
6868pub extern "kernel32" stdcallcc fn GetEnvironmentVariableA(lpName: LPCSTR, lpBuffer: LPSTR, nSize: DWORD) DWORD;
6969
......@@ -73,7 +73,7 @@ pub extern "kernel32" stdcallcc fn GetFileSizeEx(hFile: HANDLE, lpFileSize: *LAR
7373
7474pub extern "kernel32" stdcallcc fn GetFileAttributesW(lpFileName: [*]const WCHAR) DWORD;
7575
76pub extern "kernel32" stdcallcc fn GetModuleFileNameW(hModule: ?HMODULE, lpFilename: [*]u16, nSize: DWORD) DWORD;
76pub extern "kernel32" stdcallcc fn GetModuleFileNameW(hModule: ?HMODULE, lpFilename: LPWSTR, nSize: DWORD) DWORD;
7777
7878pub extern "kernel32" stdcallcc fn GetModuleHandleW(lpModuleName: ?[*]const WCHAR) HMODULE;
7979
......@@ -88,7 +88,7 @@ pub extern "kernel32" stdcallcc fn GetFileInformationByHandleEx(
8888
8989pub extern "kernel32" stdcallcc fn GetFinalPathNameByHandleW(
9090 hFile: HANDLE,
91 lpszFilePath: [*]u16,
91 lpszFilePath: LPWSTR,
9292 cchFilePath: DWORD,
9393 dwFlags: DWORD,
9494) DWORD;
......@@ -117,8 +117,8 @@ pub extern "kernel32" stdcallcc fn HeapFree(hHeap: HANDLE, dwFlags: DWORD, lpMem
117117pub extern "kernel32" stdcallcc fn HeapValidate(hHeap: HANDLE, dwFlags: DWORD, lpMem: ?*const c_void) BOOL;
118118
119119pub extern "kernel32" stdcallcc fn MoveFileExW(
120 lpExistingFileName: [*]const u16,
121 lpNewFileName: [*]const u16,
120 lpExistingFileName: LPCWSTR,
121 lpNewFileName: LPCWSTR,
122122 dwFlags: DWORD,
123123) BOOL;
124124
......@@ -141,13 +141,13 @@ pub extern "kernel32" stdcallcc fn ReadDirectoryChangesW(
141141
142142pub extern "kernel32" stdcallcc fn ReadFile(
143143 in_hFile: HANDLE,
144 out_lpBuffer: [*]u8,
144 out_lpBuffer: LPSTR,
145145 in_nNumberOfBytesToRead: DWORD,
146146 out_lpNumberOfBytesRead: ?*DWORD,
147147 in_out_lpOverlapped: ?*OVERLAPPED,
148148) BOOL;
149149
150pub extern "kernel32" stdcallcc fn RemoveDirectoryW(lpPathName: [*]const u16) BOOL;
150pub extern "kernel32" stdcallcc fn RemoveDirectoryW(lpPathName: LPCWSTR) BOOL;
151151
152152pub extern "kernel32" stdcallcc fn SetConsoleTextAttribute(hConsoleOutput: HANDLE, wAttributes: WORD) BOOL;
153153
......@@ -168,15 +168,17 @@ pub extern "kernel32" stdcallcc fn WaitForSingleObject(hHandle: HANDLE, dwMillis
168168
169169pub extern "kernel32" stdcallcc fn WriteFile(
170170 in_hFile: HANDLE,
171 in_lpBuffer: [*]const u8,
171 in_lpBuffer: LPCSTR,
172172 in_nNumberOfBytesToWrite: DWORD,
173173 out_lpNumberOfBytesWritten: ?*DWORD,
174174 in_out_lpOverlapped: ?*OVERLAPPED,
175175) BOOL;
176176
177pub extern "kernel32" stdcallcc fn WriteFileEx(hFile: HANDLE, lpBuffer: [*]const u8, nNumberOfBytesToWrite: DWORD, lpOverlapped: LPOVERLAPPED, lpCompletionRoutine: LPOVERLAPPED_COMPLETION_ROUTINE) BOOL;
177pub extern "kernel32" stdcallcc fn WriteFileEx(hFile: HANDLE, lpBuffer: LPCSTR, nNumberOfBytesToWrite: DWORD, lpOverlapped: LPOVERLAPPED, lpCompletionRoutine: LPOVERLAPPED_COMPLETION_ROUTINE) BOOL;
178178
179pub extern "kernel32" stdcallcc fn LoadLibraryW(lpLibFileName: [*]const u16) ?HMODULE;
179pub extern "kernel32" stdcallcc fn LoadLibraryW(lpLibFileName: LPCWSTR) ?HMODULE;
180
181pub extern "kernel32" stdcallcc fn GetProcAddress(hModule: HMODULE, lpProcName: LPCSTR) ?FARPROC;
180182
181183pub extern "kernel32" stdcallcc fn FreeLibrary(hModule: HMODULE) BOOL;
182184