diff --git a/build/luajit.zig b/build/luajit.zig
index 3e2cabb..3002a45 100644
--- a/build/luajit.zig
+++ b/build/luajit.zig
@@ -31,7 +31,7 @@ pub fn configure(b: *Build, target: Build.ResolvedTarget, optimize: std.builtin.
 
     // Generate the buildvm_arch.h file using minilua
     const dynasm_run = b.addRunArtifact(minilua);
-    dynasm_run.addFileArg(upstream.path("dynasm/dynasm.lua"));
+    dynasm_run.addFileArg(getDynasmLua(b, upstream));
 
     // TODO: Many more flags to figure out
     if (target.result.cpu.arch.endian() == .little) {
@@ -145,7 +145,7 @@ pub fn configure(b: *Build, target: Build.ResolvedTarget, optimize: std.builtin.
 
     buildvm_ljvm.addArg("-o");
     if (target.result.os.tag == .windows) {
-        const ljvm_ob = buildvm_ljvm.addOutputFileArg("lj_vm. o");
+        const ljvm_ob = buildvm_ljvm.addOutputFileArg("lj_vm.o");
         lib.addObjectFile(ljvm_ob);
     } else {
         const ljvm_asm = buildvm_ljvm.addOutputFileArg("lj_vm.S");
@@ -268,3 +268,34 @@ const luajit_vm = luajit_lib ++ [_][]const u8{
     "src/lib_aux.c",
     "src/lib_init.c",
 };
+
+fn getDynasmLua(b: *std.Build, upstream: *std.Build.Dependency) std.Build.LazyPath {
+    if (b.host.result.os.tag == .windows) {
+        // https://ziglang.org/learn/build-system/#mutating-source
+
+        // make modified dynasm.lua
+        const escape = b.addExecutable(.{
+            .target = b.host,
+            .name = "replace_backslash",
+            .root_source_file = b.path("build/replace_backslash.zig"),
+        });
+        const run = b.addRunArtifact(escape);
+        run.addFileArg(upstream.path("dynasm/dynasm.lua"));
+        const generated_dynasm_lua = run.addOutputFileArg("dynasm.lua");
+
+        // wf
+        // + dynasm/
+        //   + dynasm.lua: replace backslash to slash
+        //   + dasm_x64.lua
+        //   + dasm_x86.lua
+        const wf = b.addWriteFiles();
+        _ = wf.addCopyFile(generated_dynasm_lua, "dynasm/dynasm.lua");
+        _ = wf.addCopyFile(upstream.path("dynasm/dasm_x64.lua"), "dynasm/dasm_x64.lua");
+        _ = wf.addCopyFile(upstream.path("dynasm/dasm_x86.lua"), "dynasm/dasm_x86.lua");
+
+        // return modified version
+        return wf.getDirectory().path(b, "dynasm/dynasm.lua");
+    } else {
+        return upstream.path("dynasm/dynasm.lua");
+    }
+}
diff --git a/build/replace_backslash.zig b/build/replace_backslash.zig
new file mode 100644
index 0000000..ba27151
--- /dev/null
+++ b/build/replace_backslash.zig
@@ -0,0 +1,46 @@
+const std = @import("std");
+
+pub fn main() !void {
+    var arena_state = std.heap.ArenaAllocator.init(std.heap.page_allocator);
+    defer arena_state.deinit();
+    const arena = arena_state.allocator();
+
+    const args = try std.process.argsAlloc(arena);
+
+    if (args.len != 3) fatal("wrong number of arguments", .{});
+
+    const input_file_path = args[1];
+    var input_file = std.fs.cwd().openFile(input_file_path, .{}) catch |err| {
+        fatal("unable to open '{s}': {s}", .{ input_file_path, @errorName(err) });
+    };
+    defer input_file.close();
+
+    const output_file_path = args[2];
+    var output_file = std.fs.cwd().createFile(output_file_path, .{}) catch |err| {
+        fatal("unable to open '{s}': {s}", .{ output_file_path, @errorName(err) });
+    };
+    defer output_file.close();
+    std.debug.print("{s}\n", .{output_file_path});
+
+    var buf_reader = std.io.bufferedReader(input_file.reader());
+    var in_stream = buf_reader.reader();
+    var buf: [1024]u8 = undefined;
+    while (try in_stream.readUntilDelimiterOrEof(&buf, '\n')) |line| {
+        if (std.mem.indexOf(u8, line, "\"#line \"")) |_| {
+            // replace backslash to slash
+            _ = output_file.write(
+                \\    wline("#line "..g_lineno..' "'..g_fname:gsub("\\", "/")..'"')
+            ) catch @panic("write");
+        } else {
+            _ = output_file.write(line) catch @panic("write");
+            _ = output_file.write("\n") catch @panic("write");
+        }
+    }
+
+    return std.process.cleanExit();
+}
+
+fn fatal(comptime format: []const u8, args: anytype) noreturn {
+    std.debug.print(format, args);
+    std.process.exit(1);
+}