2014-06-22 2 views
0

Мне не хватало сна, поэтому я просто супер, убивая это.Как читать память у указателя (local_tbb.dwData), чтобы получить дескриптор окна

То, что я пытаюсь сделать, это получить дескриптор из окна с панели задач. После этого учебника здесь: http://www.codeproject.com/Articles/10497/A-tool-to-order-the-window-buttons-in-your-taskbar. Это специфическая часть:

Получение оконную ручку

Это было действительно повезло часть. Я подумал про себя: «Где бы я держать ручку окна?». Они должны держать их где-нибудь, чтобы активировать правильное окно при выборе кнопки . очевидное место для сохранения было бы в структуре для каждой кнопки, а очевидным местом для хранения указателя на эту структуру было бы в поле dwData каждого TBBUTTON.

Итак, я взглянул на поля dwData, и они оказались указателями. До сих пор. Затем я посмотрел на память, на которую они указывали, и вот они: первое поле хранит ручку окна Smile | :))) Разработчики Microsoft не такие разные, ведь Smile | :)

Так что я успешно получить кнопку на панели задач, как это:

в любом случае это, как я получаю local_tbb:

remote_tbb = ralloc_alloc(struct_TBButton.size); 
var rez = SendMessage(hToolbar, TB_GETBUTTON, i, ctypes.voidptr_t(remote_tbb)); 
if (!rez) { throw new Error('Failed on SendMessage of TB_GETBUTTON'); } 

var local_tbb = new struct_TBButton(); 
var retRead = ralloc_read(remote_tbb, local_tbb.address()); 
var freed = ralloc_free(remote_tbb); 
console.log('freed', freed); 

for (var n in local_tbb) { 
    console.log(n, local_tbb[n]); 
    try { 
     console.log('toString', n, local_tbb[n].toString()); 
    } catch (ignore) {} 
} 

и успешно получить dwData поле заполняется. Из этого console.log, когда он делает это на dwData:

"dwData" UInt64 { } 
"toString" "dwData" "1499288" 

Так что теперь я хочу делать то, что говорит, что парень и Then I had a look at the memory they pointed to. Поэтому я пытаюсь это сделать.

Так что я знаю, что я должен сделать что-то вроде этого, но то, что команда IPC должна идти в SendMessage (в настоящее время я использую 0x004A /** WM_COPYDATA **/, но это не может быть правильным), и где я должен поставить в local_tbb.dwData в качестве адреса?

var remote_hwnd = ralloc_alloc(ctypes.voidptr_t.size); 
    var smHwndRez = SendMessage(hToolbar, 0x004A /** WM_COPYDATA **/, local_tbb.idCommand, ctypes.voidptr_t(remote_hwnd)); 
    console.log('smHwndRez=', smHwndRez); 

    var local_hwnd = ctypes.voidptr_t; 
    var retRead = ralloc_read(remote_hwnd, local_hwnd.address()); 
    console.log('retRead=', retRead); 

    var freed = ralloc_free(remote_hwnd); 
    console.log('freed=', freed); 

    console.log('local_hwnd = ', local_hwnd, local_hwnd.toString(), uneval(local_hwnd)); 
+1

Вы действительно должны быть более конкретными в своих вопросах, и после повторного, производимая минимальные примеры кода. Люди закрывают этот вопрос, потому что «Неясно, что вы просите», и я не могу сказать, что я их виню. Хотя я * думаю * Я понимаю ваш вопрос, но это только так, потому что я читал ваши другие вопросы раньше (и мне не нравится гадать, так или иначе). Пожалуйста, перепишите свой вопрос, чтобы люди могли его понять (например, вы должны упомянуть, что используете WINAPI из Firefox js-ctypes, поэтому обычные пользователи WINAPI не путаются, а WTF - 'ralloc_alloc' , и т. д.) – nmaier

+0

А, ладно, я сейчас поработаю над этим. Это мой код, который может работать в блокноте (копировать/вставлять), но трудно сделать минимальное количество его, которое можно воспроизвести. :([GitHubGist :: _ff-addon-snippet-GetHandleFromTBB] (https://gist.github.com/Noitidart/1fc56b28be82d45a245d) Я прокомментировал часть дескриптора get, потому что так плохо, что комментарий начинается в строке 238. – Noitidart

ответ

1

Строго говоря, это не winapi, так как это не является частью API, но не имеющих документов деталей реализации.

Из того, что я могу собрать:

  • Получить данные TBBUTTON.
  • .dwData содержит указатель на несколько (?) HANDLE сек (voidptr_t ы)
  • Так переинтерпретировать .dwData как voidptr_t, т.е. new ctypes.voidptr_t(.dwData);
  • использовать ReadProcessMemory, чтобы прочитать другой указатель из местоположения .dwData указывает на. Это (должно быть) ваш дескриптор окна.

Так что-то вроде этого:

var tbb = new TBButton(); 
... 
var dataPtr = new ctypes.voidptr_t(tbb.dwData); 
var handle = new ctypes.voidptr_t(); 
// Important: pass the address of |handle|, not |handle| itself. 
if (!ReadProcessMemory(process, dataPtr, handle.address(), ctypes.voidptr_t.size, null)) { 
    throw new Error("Failed to read window handle"); 
} 
+0

Oh я очень благодарен вам за то, что он работал отлично! Мы должны использовать 'new' перед' ctypes.voidptr_t ('? Я никогда этого не делаю, мне просто интересно, нужно ли мне менять. Вот скопируйте код, который можно скопировать [GitHubGist :: Noitidart/_ff-addon-snippet-GetHandleFromTBB] (https://gist.github.com/Noitidart/1fc56b28be82d45a245d). Я по-прежнему буду работать над редактированием сообщения о теме, благодаря большому количеству людей. – Noitidart