@@ -34,111 +34,111 @@ PCHAR pXmlBuffer;
34
34
35
35
void DOpus::GetSelected (PWCHAR buffer)
36
36
{
37
- /*
38
- * CPU Disasm
39
- * 6A44B588 |. 68 A839526A PUSH OFFSET 6A5239A8 ; /WindowName = "Directory Opus"
40
- * 6A44B58D |. 68 6459526A PUSH OFFSET 6A525964 ; |ClassName = "DOpus.ParentWindow"
41
- * 6A44B592 |. 894424 40 MOV DWORD PTR SS:[ESP+40],EAX ; |
42
- * 6A44B596 |. C74424 30 140 MOV DWORD PTR SS:[ESP+30],14 ; |
43
- * 6A44B59E |. FFD7 CALL EDI ; \USER32.FindWindowW
44
- * ...
45
- * 00BC2E9B |. 50 PUSH EAX ; /lParam = 12FE80C -> 15 ;
46
- * 00BC2E9C |. 57 PUSH EDI ; |wParam ; class = dopusrt.getinfo
47
- * 00BC2E9D |. 6A 4A PUSH 4A ; |Msg = WM_COPYDATA
48
- * 00BC2E9F |. FF75 FC PUSH DWORD PTR SS:[LOCAL.1] ; |hWnd => [LOCAL.1] ; class = DOpus.ParentWindow, text = Directory Opus
49
- * 00BC2EA2 |. FF15 0802C000 CALL DWORD PTR DS:[<&USER32.SendMessageW ; \USER32.SendMessageW
50
- *
51
- * CPU Stack
52
- * 012FE80C |00000015
53
- * 012FE810 |00000010
54
- * 012FE814 |013A26C0 ; UNICODE "listsel"
55
- */
56
-
57
- if (hMsgWnd == nullptr )
58
- PrepareMessageWindow ();
59
- if (hMsgWnd == nullptr )
60
- return ;
61
-
62
- PWCHAR data = DOPUS_IPC_LP_DATA;
63
- COPYDATASTRUCT cds;
64
- cds.dwData = DOPUS_IPC_LP_INFO;
65
- cds.cbData = static_cast <DWORD>(wcslen (data) + 1 ) * sizeof WCHAR;
66
- cds.lpData = data;
67
-
68
- auto ret = SendMessage (FindWindow (DOPUS_CLASS, DOPUS_NAME), WM_COPYDATA, reinterpret_cast <WPARAM>(hMsgWnd),
69
- reinterpret_cast <LPARAM>(&cds));
70
- if (!ret)
71
- return ;
72
-
73
- WaitForSingleObject (hGetResultEvent, 2000 );
74
-
75
- ParseXmlBuffer (buffer);
76
-
77
- delete[] pXmlBuffer;
37
+ /*
38
+ * CPU Disasm
39
+ * 6A44B588 |. 68 A839526A PUSH OFFSET 6A5239A8 ; /WindowName = "Directory Opus"
40
+ * 6A44B58D |. 68 6459526A PUSH OFFSET 6A525964 ; |ClassName = "DOpus.ParentWindow"
41
+ * 6A44B592 |. 894424 40 MOV DWORD PTR SS:[ESP+40],EAX ; |
42
+ * 6A44B596 |. C74424 30 140 MOV DWORD PTR SS:[ESP+30],14 ; |
43
+ * 6A44B59E |. FFD7 CALL EDI ; \USER32.FindWindowW
44
+ * ...
45
+ * 00BC2E9B |. 50 PUSH EAX ; /lParam = 12FE80C -> 15 ;
46
+ * 00BC2E9C |. 57 PUSH EDI ; |wParam ; class = dopusrt.getinfo
47
+ * 00BC2E9D |. 6A 4A PUSH 4A ; |Msg = WM_COPYDATA
48
+ * 00BC2E9F |. FF75 FC PUSH DWORD PTR SS:[LOCAL.1] ; |hWnd => [LOCAL.1] ; class = DOpus.ParentWindow, text = Directory Opus
49
+ * 00BC2EA2 |. FF15 0802C000 CALL DWORD PTR DS:[<&USER32.SendMessageW ; \USER32.SendMessageW
50
+ *
51
+ * CPU Stack
52
+ * 012FE80C |00000015
53
+ * 012FE810 |00000010
54
+ * 012FE814 |013A26C0 ; UNICODE "listsel"
55
+ */
56
+
57
+ if (hMsgWnd == nullptr )
58
+ PrepareMessageWindow ();
59
+ if (hMsgWnd == nullptr )
60
+ return ;
61
+
62
+ PWCHAR data = DOPUS_IPC_LP_DATA;
63
+ COPYDATASTRUCT cds;
64
+ cds.dwData = DOPUS_IPC_LP_INFO;
65
+ cds.cbData = static_cast <DWORD>(wcslen (data) + 1 ) * sizeof WCHAR;
66
+ cds.lpData = data;
67
+
68
+ auto ret = SendMessage (FindWindow (DOPUS_CLASS, DOPUS_NAME), WM_COPYDATA, reinterpret_cast <WPARAM>(hMsgWnd),
69
+ reinterpret_cast <LPARAM>(&cds));
70
+ if (!ret)
71
+ return ;
72
+
73
+ WaitForSingleObject (hGetResultEvent, 2000 );
74
+
75
+ ParseXmlBuffer (buffer);
76
+
77
+ delete[] pXmlBuffer;
78
78
}
79
79
80
80
void DOpus::ParseXmlBuffer (PWCHAR buffer)
81
81
{
82
- /*
83
- * <?xml version="1.0" encoding="UTF-8"?>
84
- * <results command="listsel" result="1">
85
- * <items display_path="C:\folder" lister="0x707f6" path="C:\folder" tab="0xb0844">
86
- * <item id="11" name="1.jpg" path="C:\folder\1.jpg" type="0" />
87
- * <item id="12" name="2.zip" path="C:\folder\2.zip" type="1" />
88
- * ...
89
- */
90
-
91
- using namespace rapidxml ;
92
-
93
- xml_document<> doc;
94
- doc.parse <0 >(pXmlBuffer);
95
-
96
- auto results = doc.first_node (" results" );
97
- auto items = results->first_node (" items" );
98
- for (auto item = items->first_node (" item" ); item; item = item->next_sibling (" item" ))
99
- {
100
- auto path = item->first_attribute (" path" )->value ();
101
-
102
- auto size = MultiByteToWideChar (CP_UTF8, MB_ERR_INVALID_CHARS, path, -1 , nullptr , 0 );
103
- auto b = new WCHAR[size];
104
- MultiByteToWideChar (CP_UTF8, MB_ERR_INVALID_CHARS, path, -1 , b, size);
105
-
106
- wcscpy_s (buffer, wcslen (b) + 1 , b); // DOpus supports Long Path
107
-
108
- delete[] b;
109
- return ; // we now cares only the first result
110
- }
82
+ /*
83
+ * <?xml version="1.0" encoding="UTF-8"?>
84
+ * <results command="listsel" result="1">
85
+ * <items display_path="C:\folder" lister="0x707f6" path="C:\folder" tab="0xb0844">
86
+ * <item id="11" name="1.jpg" path="C:\folder\1.jpg" type="0" />
87
+ * <item id="12" name="2.zip" path="C:\folder\2.zip" type="1" />
88
+ * ...
89
+ */
90
+
91
+ using namespace rapidxml ;
92
+
93
+ xml_document<> doc;
94
+ doc.parse <0 >(pXmlBuffer);
95
+
96
+ auto results = doc.first_node (" results" );
97
+ auto items = results->first_node (" items" );
98
+ for (auto item = items->first_node (" item" ); item; item = item->next_sibling (" item" ))
99
+ {
100
+ auto path = item->first_attribute (" path" )->value ();
101
+
102
+ auto size = MultiByteToWideChar (CP_UTF8, MB_ERR_INVALID_CHARS, path, -1 , nullptr , 0 );
103
+ auto b = new WCHAR[size];
104
+ MultiByteToWideChar (CP_UTF8, MB_ERR_INVALID_CHARS, path, -1 , b, size);
105
+
106
+ wcscpy_s (buffer, wcslen (b) + 1 , b); // DOpus supports Long Path
107
+
108
+ delete[] b;
109
+ return ; // we now cares only the first result
110
+ }
111
111
}
112
112
113
113
void DOpus::PrepareMessageWindow ()
114
114
{
115
- WNDCLASSEX wx = {sizeof wx};
116
- wx.cbSize = sizeof (WNDCLASSEX);
117
- wx.lpfnWndProc = msgWindowProc;
118
- wx.lpszClassName = MSGWINDOW_CLASS;
115
+ WNDCLASSEX wx = {sizeof wx};
116
+ wx.cbSize = sizeof (WNDCLASSEX);
117
+ wx.lpfnWndProc = msgWindowProc;
118
+ wx.lpszClassName = MSGWINDOW_CLASS;
119
119
120
- if (RegisterClassEx (&wx))
121
- hMsgWnd = CreateWindowEx (0 , MSGWINDOW_CLASS, L" " , 0 , 0 , 0 , 0 , 0 , HWND_MESSAGE, nullptr , nullptr , nullptr );
120
+ if (RegisterClassEx (&wx))
121
+ hMsgWnd = CreateWindowEx (0 , MSGWINDOW_CLASS, L" " , 0 , 0 , 0 , 0 , 0 , HWND_MESSAGE, nullptr , nullptr , nullptr );
122
122
123
- hGetResultEvent = CreateEvent (nullptr , FALSE , FALSE , nullptr );
123
+ hGetResultEvent = CreateEvent (nullptr , FALSE , FALSE , nullptr );
124
124
}
125
125
126
126
LRESULT CALLBACK DOpus::msgWindowProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
127
127
{
128
- switch (uMsg)
129
- {
130
- case WM_COPYDATA:
131
- {
132
- auto cds = reinterpret_cast <PCOPYDATASTRUCT>(lParam);
133
- auto buf = static_cast <PCHAR>(cds->lpData );
134
-
135
- pXmlBuffer = new CHAR[cds->cbData + 1 ]{' \0 ' };
136
- memcpy (pXmlBuffer, buf, cds->cbData );
137
-
138
- SetEvent (hGetResultEvent);
139
- return 0 ;
140
- }
141
- default :
142
- return DefWindowProc (hWnd, uMsg, wParam, lParam);
143
- }
128
+ switch (uMsg)
129
+ {
130
+ case WM_COPYDATA:
131
+ {
132
+ auto cds = reinterpret_cast <PCOPYDATASTRUCT>(lParam);
133
+ auto buf = static_cast <PCHAR>(cds->lpData );
134
+
135
+ pXmlBuffer = new CHAR[cds->cbData + 1 ]{' \0 ' };
136
+ memcpy (pXmlBuffer, buf, cds->cbData );
137
+
138
+ SetEvent (hGetResultEvent);
139
+ return 0 ;
140
+ }
141
+ default :
142
+ return DefWindowProc (hWnd, uMsg, wParam, lParam);
143
+ }
144
144
}
0 commit comments