@@ -34,111 +34,111 @@ PCHAR pXmlBuffer;
3434
3535void DOpus::GetSelected (PWCHAR buffer)
3636{
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;
7878}
7979
8080void DOpus::ParseXmlBuffer (PWCHAR buffer)
8181{
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+ }
111111}
112112
113113void DOpus::PrepareMessageWindow ()
114114{
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;
119119
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 );
122122
123- hGetResultEvent = CreateEvent (nullptr , FALSE , FALSE , nullptr );
123+ hGetResultEvent = CreateEvent (nullptr , FALSE , FALSE , nullptr );
124124}
125125
126126LRESULT CALLBACK DOpus::msgWindowProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
127127{
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+ }
144144}
0 commit comments