1 /**
2  * 消した矢印を元に戻す。
3  *
4  * Author: $(LINK2 https://twitter.com/dokutoku3, dokutoku)
5  * License: $(LINK2 https://creativecommons.org/publicdomain/zero/1.0/, CC0 1.0 Universal)
6  */
7 module remove_shortcut_arrow.restore;
8 
9 
10 version (Windows):
11 
12 version (NON_WINREG) {
13 } else {
14 	version = IS_WINREG;
15 }
16 
17 private static import core.sys.windows.winbase;
18 private static import core.sys.windows.windef;
19 private static import core.sys.windows.winnt;
20 private static import remove_shortcut_arrow.command;
21 private static import remove_shortcut_arrow.path;
22 private static import remove_shortcut_arrow.registory;
23 
24 /**
25  * プログラムのディレクトリからファイルを削除する。
26  */
27 nothrow @nogc
28 private bool delete_files(const core.sys.windows.winnt.LPCWSTR ico_path, const core.sys.windows.winnt.LPCWSTR program_path)
29 
30 	do
31 	{
32 		if (core.sys.windows.winbase.DeleteFileW(ico_path) == core.sys.windows.windef.FALSE) {
33 			return false;
34 		}
35 
36 		return core.sys.windows.winbase.RemoveDirectoryW(program_path) != core.sys.windows.windef.FALSE;
37 	}
38 
39 /**
40  * 削除したショートカットアイコンを元に戻す。
41  */
42 version (IS_WINREG)
43 extern (C)
44 nothrow @nogc
45 public bool restore_windows_shortcut_arrow()
46 
47 	do
48 	{
49 		bool result1 = remove_shortcut_arrow.registory.delete_registory();
50 
51 		remove_shortcut_arrow.path.program_path_buffer buffer = void;
52 
53 		bool result2 = remove_shortcut_arrow.path.get_program_path(buffer);
54 
55 		if (result2) {
56 			result2 = .delete_files(&(buffer.ico_path[0]), &(buffer.program_path[0]));
57 		}
58 
59 		return (result1) && (result2);
60 	}
61 
62 /**
63  * REGコマンドを利用して、レジストリの特定の値を削除する
64  */
65 extern (C)
66 nothrow @nogc
67 public bool exec_restore_windows_shortcut_arrow_command()
68 
69 	do
70 	{
71 		//Unicode版はバッファに入れなければならない
72 		wchar[remove_shortcut_arrow.command.REG_DELETE_COMMAND_BUFFER_LENGTH] command_buffer = void;
73 
74 		if (!remove_shortcut_arrow.command.copy_restore_windows_shortcut_arrow_command(&(command_buffer[0]), command_buffer.length)) {
75 			return false;
76 		}
77 
78 		return remove_shortcut_arrow.command.exec_system32_command(&(command_buffer[0]));
79 	}
80 
81 /**
82  * REGコマンドを利用して、削除したショートカットアイコンを元に戻す。
83  */
84 extern (C)
85 nothrow @nogc
86 public bool reg_restore_windows_shortcut_arrow()
87 
88 	do
89 	{
90 		bool result1 = .exec_restore_windows_shortcut_arrow_command();
91 
92 		remove_shortcut_arrow.path.program_path_buffer buffer = void;
93 
94 		bool result2 = remove_shortcut_arrow.path.get_program_path(buffer);
95 
96 		if (result2) {
97 			result2 = .delete_files(&(buffer.ico_path[0]), &(buffer.program_path[0]));
98 		}
99 
100 		return (result1) && (result2);
101 	}
102 
103 version (RESTORE_SHORTCUT_ARROW)
104 extern (Windows)
105 nothrow @nogc
106 int WinMain(core.sys.windows.windef.HINSTANCE hInstance, core.sys.windows.windef.HINSTANCE hPrevInstance, core.sys.windows.winnt.LPSTR pCmdLine, int nCmdShow)
107 
108 	do
109 	{
110 		version (IS_WINREG) {
111 			return (.restore_windows_shortcut_arrow()) ? (0) : (1);
112 		} else {
113 			return (.reg_restore_windows_shortcut_arrow()) ? (0) : (1);
114 		}
115 	}