Question

I have some code like this:

TBBUTTONINFO mtbbi;
HWND hwnd;
HANDLE hProc;
DWORD dwProcessID;
void* lpData;

.....

GetWindowThreadProcessId(hwnd, &dwProcessID);
hProc = OpenProcess(PROCESS_ALL_ACCESS, 0, dwProcessID);
lpData = VirtualAllocEx(hProc , 0, sizeof(TBBUTTONINFO), MEM_COMMIT, PAGE_READWRITE);
memset(&mtbbi,0,sizeof(mtbbi));
mtbbi.cbSize=sizeof(TBBUTTONINFO);
mtbbi.dwMask=TBIF_BYINDEX|TBIF_LPARAM;  
WriteProcessMemory(hProc,lpData,&mtbbi,sizeof(TBBUTTONINFO),&dwBytesRead);
SendMessage(hwnd, TB_GETBUTTONINFO, 0, (LPARAM)lpData);
ReadProcessMemory(hProc, lpData, &mtbbi, sizeof(TBBUTTONINFO), &dwBytesRead);

where hwnd - is a toolbar handle. This handle is correct, other messages(like TB_BUTTONCOUNT or TB_GETBUTTON) work fine. So, this code is working correctly under Windows XP, but when I try to execute it under Windows 7 x64 SendMessage returns -1, which means an error. I tried to use GETBUTTONINFOA instead of GETBUTTONINFO, but result is the same.

What am I doing wrong?

Was it helpful?

Solution

Solved it. Problem was that TBBUTTONINFO structure contains pointers, which take double size in 64-bit processes. I made my own structure, replacing pointers with int64, and with this structure SendMessage work as expected. Thanks to everyone for help.

OTHER TIPS

Starting with Windows Vista the User Interface Privilege Isolation provides restrictions to the system that prevents lower-privilege applications from sending window messages or installing hooks in higher-privilege processes. However, higher-privilege applications are still permitted to send window messages to lower-privilege processes. These restrictions are implemented throw SendMessage and other message sending functions.

I'm not sure whether this is the cause for your problem, because in general, read-only message are not blocked even from lower-privilege processes. Your TB_GETBUTTONINFO seem to be such a message, same for TB_BUTTONCOUNT and TB_GETBUTTON. However, you should investigate this.

See Windows Integrity Mechanism Design for more information.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top