Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ и WinAPI
Войти
Регистрация
Восстановить пароль
 
Владимир В
1 / 1 / 1
Регистрация: 06.05.2011
Сообщений: 58
#1

Префиксы xxx перед именами функций ядра Windows - C++ WinAPI

22.10.2013, 00:25. Просмотров 678. Ответов 9
Метки нет (Все метки)

В исходниках Winows NT функции из раздела \ntuser\kernel вместо обычных имен предваряются префиксами "xxx", например xxxSendMessage() вместо SendMessage(), xxxGetMessage() вместо GetMessage() и так далее. Что это значит? Ведь в программах на языке С программист использует прототипы без этих префиксов, и все они обнаруживаются при компиляции и сборке. Но вроде как нигде нет перопределений вроде #define xxxSendMessage SendMessage. Или создатели исходников перед сборкой Windows просто вручную удаляют эти "xxx" перед именами функций? Или это какое-то свойство языка, заставляющее компилятор "убирать" эти префиксы?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.10.2013, 00:25
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Префиксы xxx перед именами функций ядра Windows (C++ WinAPI):

Что означают, префиксы в аргументах функций MSDN? _In_
_In_ данный префикс стоит перед многими параметрами в функциях в мсдн. Что он...

Модуль ядра для windows
Расскажите, добрые люди, что это такое? И в чем отличия модулей ядра от каких...

список объектов ядра Windows
Господа, хотел задать вам вопрос, с надеждой получить на него какой-нибудь...

Список объектов ядра Windows
Всем доброго времени суток! Есть следующее задание: "написать программу на...

Для чего нужны точки перед именами функций?
Для чего нужны точки перед именами функций? Set xmlRequest =...

Как в Java ввести строку формата xxx.xxx.xxx.xxx
Здравствуйте. Подскажите пожалуйста как в Java ввести строчку формата...

9
mytilus
83 / 83 / 26
Регистрация: 04.10.2012
Сообщений: 340
22.10.2013, 13:04 #2
Функции с префиксом xxx - это чанки.
0
Владимир В
1 / 1 / 1
Регистрация: 06.05.2011
Сообщений: 58
22.10.2013, 19:05  [ТС] #3
А что такое "чанки"? (Chunks). Это слово встречается только в описаниях блоков звуковых файлов, да в компьютерных играх... Это какие-то макросы или inline функции? Но тогда они были бы видны в исходниках - а они отсутствуют, и тем не менее обращение к функциям часто делается в безпрефиксном виде и это считается корректным. Почему?
0
Убежденный
Ушел с форума
Эксперт С++
15941 / 7252 / 1176
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
22.10.2013, 19:08 #4
Цитата Сообщение от Владимир В Посмотреть сообщение
Но тогда они были бы видны в исходниках - а они отсутствуют
Вы говорите об исходниках так, как об истине в последней инстанции.
А между тем, речь, полагаю, идет о гуляющих в сети NT4/Win2K - так они не полные,
да и в официальных WRK тоже очень многое вырезано.
0
Владимир В
1 / 1 / 1
Регистрация: 06.05.2011
Сообщений: 58
22.10.2013, 20:43  [ТС] #5
Да, конечно, именно эти неполные я и имею в виду. Вопрос не в том, что там просто могут быть вырезаны фрагменты с соответствующими переопределениями, а в том, может ли быть, что такой синтаксис допустим в предположении, что переопределений на самом деле нет, но компиляторы за счет каких-то настроек такие функции с префиксами понимают и превращают в обычные
0
NickoTin
Почетный модератор
Эксперт .NET
8435 / 3557 / 402
Регистрация: 14.06.2010
Сообщений: 4,512
Записей в блоге: 9
22.10.2013, 21:27 #6
Цитата Сообщение от Владимир В Посмотреть сообщение
xxxSendMessage() вместо SendMessage
Функции с префиксом 'xxx' - это не экспортируемые функции ядра. В исходниках Win2K они есть.
Нормально поживают и в современных ОС (конечно, с изменениями).

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/***********************************************************************\
* xxxSendMessage (API)
*
* This function synchronously sends a message to a window. The four
* parameters hwnd, message, wParam, and lParam are passed to the window
* procedure of the receiving window.  If the window receiving the message
* belongs to the same queue as the current thread, the window proc is called
* directly.  Otherwise, we set up an sms structure, wake the appropriate
* thread to receive the message and wait for a reply.
*
* Returns:
*   the value returned by the window procedure, or NULL if there is an error
*
* History:
* 01-13-91 DavidPe      Ported.
\***********************************************************************/
 
LRESULT xxxSendMessage(
    PWND pwnd,
    UINT message,
    WPARAM wParam,
    LPARAM lParam)
{
    return xxxSendMessageTimeout( pwnd, message, wParam, lParam,
            SMTO_NORMAL, 0, NULL );
}
xxxSendMessageTimeout
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
/***********************************************************************\
* xxxSendMessageTimeout (API)
*
* This function synchronously sends a message to a window. The four
* parameters hwnd, message, wParam, and lParam are passed to the window
* procedure of the receiving window.  If the window receiving the message
* belongs to the same queue as the current thread, the window proc is called
* directly.  Otherwise, we set up an sms structure, wake the appropriate
* thread to receive the message and wait for a reply.
* If the thread is 'hung' or if the time-out value is exceeded, we will
* fail the request.
*
* lpdwResult = NULL if normal sendmessage, if !NULL then it's a timeout call
*
* Returns:
*   the value returned by the window procedure, or NULL if there is an error
*
* History:
* 07-13-92 ChrisBl      Created/extended from SendMessage
\***********************************************************************/
 
LRESULT xxxSendMessageTimeout(
    PWND pwnd,
    UINT message,
    WPARAM wParam,
    LPARAM lParam,
    UINT fuFlags,
    UINT uTimeout,
    PLONG_PTR lpdwResult)
{
    LRESULT lRet;
    PTHREADINFO ptiCurrent;
    ULONG_PTR uResult;   // holder for DDE_INITIATE case
 
    CheckCritIn();
 
    if (lpdwResult != NULL)
       *lpdwResult = 0L;
 
    /*
     * Is this a BroadcastMsg()?
     */
    if (pwnd == PWND_BROADCAST) {
        BROADCASTMSG bcm;
        PBROADCASTMSG pbcm = NULL;
        UINT uCmd = BMSG_SENDMSG;
 
        if (lpdwResult != NULL) {
            uCmd = BMSG_SENDMSGTIMEOUT;
            bcm.to.fuFlags = fuFlags;
            bcm.to.uTimeout = uTimeout;
            bcm.to.lpdwResult = lpdwResult;
            pbcm = &bcm;
        }
 
        return xxxBroadcastMessage(NULL, message, wParam, lParam, uCmd, pbcm );
    }
 
    CheckLock(pwnd);
 
    if (message >= WM_DDE_FIRST && message <= WM_DDE_LAST) {
        /*
         * Even though apps should only send WM_DDE_INITIATE or WM_DDE_ACK
         * messages, we hook them all so DDESPY can monitor them.
         */
        if (!xxxDDETrackSendHook(pwnd, message, wParam, lParam)) {
            return 0;
        }
        if (message == WM_DDE_INITIATE && guDdeSendTimeout) {
            /*
             * This hack prevents DDE apps from locking up because some
             * bozo in the system has a top level window and is not
             * processing messages.  guDdeSendTimeout is registry set.
             */
            if (lpdwResult == NULL) {
                lpdwResult = &uResult;
            }
            fuFlags |= SMTO_ABORTIFHUNG;
            uTimeout = guDdeSendTimeout;
        }
    }
 
    ptiCurrent = PtiCurrent();
 
    /*
     * Do inter-thread call if window queue differs from current queue
     */
    if (ptiCurrent != GETPTI(pwnd)) {
        INTRSENDMSGEX ism;
        PINTRSENDMSGEX pism = NULL;
 
        /*
         * If this window is a zombie, don't allow inter-thread send messages
         * to it.
         */
        if (HMIsMarkDestroy(pwnd))
            return xxxDefWindowProc(pwnd, message, wParam, lParam);
 
        if ( lpdwResult != NULL ) {
            /*
             * fail if we think the thread is hung
             */
            if ((fuFlags & SMTO_ABORTIFHUNG) && FHungApp(GETPTI(pwnd), CMSWAITTOKILLTIMEOUT))
               return 0;
 
            /*
             * Setup for a InterSend time-out call
             */
            ism.fuCall = ISM_TIMEOUT;
            ism.fuSend = fuFlags;
            ism.uTimeout = uTimeout;
            ism.lpdwResult = lpdwResult;
            pism = &ism;
        }
 
        lRet = xxxInterSendMsgEx(pwnd, message, wParam, lParam,
                ptiCurrent, GETPTI(pwnd), pism );
 
        return lRet;
    }
 
    /*
     * Call WH_CALLWNDPROC if it's installed and the window is not marked
     * as destroyed.
     */
    if (IsHooked(ptiCurrent, WHF_CALLWNDPROC)) {
        CWPSTRUCTEX cwps;
 
        cwps.hwnd = HWq(pwnd);
        cwps.message = message;
        cwps.wParam = wParam;
        cwps.lParam = lParam;
        cwps.psmsSender = NULL;
 
        /*
         * Unlike Win3.1, NT and Win95 ignore any changes the app makes
         * to the CWPSTRUCT contents.
         */
        xxxCallHook(HC_ACTION, FALSE, (LPARAM)&cwps, WH_CALLWNDPROC);
 
        /*
         * Unlike Win3.1, NT and Win95 ignore any changes the app makes
         * to the CWPSTRUCT contents.  If this behavior reverts to
         * Win3.1 semantics, we will need to copy the new parameters
         * from cwps.
         */
    }
 
    /*
     * If this window's proc is meant to be executed from the server side
     * we'll just stay inside the semaphore and call it directly.  Note
     * how we don't convert the pwnd into an hwnd before calling the proc.
     */
    if (TestWF(pwnd, WFSERVERSIDEPROC)) {
 
        /*
         * We have a number of places where we do recursion in User.  This often goes
         * through SendMessage (when we send a message to the parent for example) which
         * can eat the amount of stack we have
         */
        if (((ULONG_PTR)&uResult - (ULONG_PTR)KeGetCurrentThread()->StackLimit) < KERNEL_STACK_MINIMUM_RESERVE) {
            RIPMSG1(RIP_ERROR, "SendMessage: Thread recursing in User with message %lX; failing", message);
            return FALSE;
        }
 
        lRet = pwnd->lpfnWndProc(pwnd, message, wParam, lParam);
 
        if ( lpdwResult == NULL ) {
            return lRet;
        } else {      /* time-out call */
            *lpdwResult = lRet;
            return TRUE;
        }
    }
 
    /*
     * Call the client or xxxDefWindowProc. pwnd is already locked.
     */
    XXXSENDMESSAGETOCLIENT(pwnd, message, wParam, lParam, NULL, FALSE);
 
    /*
     * Call WH_CALLWNDPROCRET if it's installed.
     */
    if (IsHooked(ptiCurrent, WHF_CALLWNDPROCRET)) {
        CWPRETSTRUCTEX cwps;
 
        cwps.hwnd = HWq(pwnd);
        cwps.message = message;
        cwps.wParam = wParam;
        cwps.lParam = lParam;
        cwps.lResult = lRet;
        cwps.psmsSender = NULL;
 
        /*
         * Unlike Win3.1, NT and Win95 ignore any changes the app makes
         * to the CWPSTRUCT contents.
         */
        xxxCallHook(HC_ACTION, FALSE, (LPARAM)&cwps, WH_CALLWNDPROCRET);
 
        /*
         * Unlike Win3.1, NT and Win95 ignore any changes the app makes
         * to the CWPSTRUCT contents.  If this behavior reverts to
         * Win3.1 semantics, we will need to copy the new parameters
         * from cwps.
         */
    }
 
    if ( lpdwResult != NULL ) {     /* time-out call */
        *lpdwResult = lRet;
        return TRUE;
    }
 
    return lRet;
}


Добавлено через 3 минуты
C
1
2
#define xxxGetMessage(lpmsg, hwnd, wMsgMin, wMsgMax) \
    xxxInternalGetMessage(lpmsg, hwnd, wMsgMin, wMsgMax, PM_REMOVE, TRUE)
0
Владимир В
1 / 1 / 1
Регистрация: 06.05.2011
Сообщений: 58
22.10.2013, 22:01  [ТС] #7
Так в том-то и дело, что функция названа xxxSendMessage(). А в приложениях она (или не она?) вызывается под именем SendMessage(). Если это она, то должно же быть где-то что-то вроде :
#define GetMessage(lpmsg, hwnd, wMsgMin, wMsgMax) \
xxxGetMessage(lpmsg, hwnd, wMsgMin, wMsgMax)
???
0
NickoTin
Почетный модератор
Эксперт .NET
8435 / 3557 / 402
Регистрация: 14.06.2010
Сообщений: 4,512
Записей в блоге: 9
22.10.2013, 22:04 #8
Цитата Сообщение от Владимир В Посмотреть сообщение
или не она
Не она. xxxSendMessage - функция ядра (Kernel mode, находится в win32k.sys), SendMessage - функция пользовательского режима (User mode, находится в user32.dll).
0
Владимир В
1 / 1 / 1
Регистрация: 06.05.2011
Сообщений: 58
23.10.2013, 21:32  [ТС] #9
Тогда как понять то, что всякие источники, если они перечисляют функции модуля win32k.sys, функций типа xxxSendMessage и прочих с префиксами ххх не называют? Да и прямой просмотр файла win32k.sys находит там текстовые имена разных функций, но только не эти. Или из за того, что эти функции неэкспортируемые, то текстовых их имен в явном виде мы потому и не находим, хотя они там и есть? Также в исходниках (раздел ntos\w32\ntuser\client, файл user32.def) есть комментарий :
C++
1
2
3
4
5
6
7
; sendmsg.c "Window message sending/posting APIs and support routines."
;
    SendMessageA
    SendMessageW
    SendMessageTimeoutA
    SendMessageTimeoutW
..........
Но файл sendmsg.c из раздела \ntuser\kernel как раз содержит не их, а xxxSendMessage, xxxSendMessageTimeout и т.д. Или есть еще один файл sendmsg.c, но из за неполноты этих исходников просто отсутствует? Тогда все встало бы на свои места...
0
NickoTin
Почетный модератор
Эксперт .NET
8435 / 3557 / 402
Регистрация: 14.06.2010
Сообщений: 4,512
Записей в блоге: 9
23.10.2013, 22:03 #10
Цитата Сообщение от Владимир В Посмотреть сообщение
Или из за того, что эти функции неэкспортируемые
Именно.
Цитата Сообщение от Владимир В Посмотреть сообщение
user32.def
Это файл описывающий список экспортируемых функций.
Цитата Сообщение от Владимир В Посмотреть сообщение
есть комментарий
В нём не говорится где расположены эти функции (в каком файле с кодом), а судя по всему это комментарий к содержимому этого файла: "API для отправки оконных сообщений и вспомогательные процедуры", о том что там должны располагаться функции описанные ниже ничего не говорится. В самом же начале def файла написано к какой библиотеке файл относится: LIBRARY USER32
Да и как-бы расположение файла "sendmsg.c" - "\ntuser\kernel" намекает на то к чему относятся функции, остальные комментарии в файле говорят о том же самом. Сомневаюсь что разработчики стали бы пихать функции Kernel и User mode в один файл.
1
23.10.2013, 22:03
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.10.2013, 22:03
Привет! Вот еще темы с решениями:

IPFW. Не срабатывает правило с not адресом (not xxx.xxx.xxx.xxx)
Не работает - запретить всем локальным машинам сети, кроме ...0.52 ходить в...

Вывести все номера телефонов, содержащиеся в сообщении соответсвующие форматам xx-xx-xx, xxx-xxx и xxx-xx-xx
Вывести все номера телефонов, содержащиеся в сообщении соответсвующие форматам...

Префиксы L и u перед строкой в кавычках
Предположим есть две строки: UnicodeString Str1 = L&quot;Привет, Мир!&quot;; wchar_t...

mailto:xxx@xxx.xxx?subject=The file <Y> cannot be found.
в скрипте стоит следующее document.write('&lt;a...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru