Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
2 / 2 / 1
Регистрация: 06.05.2011
Сообщений: 126

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

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

Студворк — интернет-сервис помощи студентам
В исходниках Winows NT функции из раздела \ntuser\kernel вместо обычных имен предваряются префиксами "xxx", например xxxSendMessage() вместо SendMessage(), xxxGetMessage() вместо GetMessage() и так далее. Что это значит? Ведь в программах на языке С программист использует прототипы без этих префиксов, и все они обнаруживаются при компиляции и сборке. Но вроде как нигде нет перопределений вроде #define xxxSendMessage SendMessage. Или создатели исходников перед сборкой Windows просто вручную удаляют эти "xxx" перед именами функций? Или это какое-то свойство языка, заставляющее компилятор "убирать" эти префиксы?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.10.2013, 00:25
Ответы с готовыми решениями:

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

Как в Java ввести строку формата xxx.xxx.xxx.xxx
Здравствуйте. Подскажите пожалуйста как в Java ввести строчку формата xxx.xxx.xxx.xxx и чтобы можно было работать с каждым из 4 этих чисел?

IPFW. Не срабатывает правило с not адресом (not xxx.xxx.xxx.xxx)
Не работает - запретить всем локальным машинам сети, кроме ...0.52 ходить в Инет (to any, any to, всяко болт) add deny ip from not...

9
87 / 86 / 27
Регистрация: 04.10.2012
Сообщений: 355
22.10.2013, 13:04
Функции с префиксом xxx - это чанки.
0
2 / 2 / 1
Регистрация: 06.05.2011
Сообщений: 126
22.10.2013, 19:05  [ТС]
А что такое "чанки"? (Chunks). Это слово встречается только в описаниях блоков звуковых файлов, да в компьютерных играх... Это какие-то макросы или inline функции? Но тогда они были бы видны в исходниках - а они отсутствуют, и тем не менее обращение к функциям часто делается в безпрефиксном виде и это считается корректным. Почему?
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
22.10.2013, 19:08
Цитата Сообщение от Владимир В Посмотреть сообщение
Но тогда они были бы видны в исходниках - а они отсутствуют
Вы говорите об исходниках так, как об истине в последней инстанции.
А между тем, речь, полагаю, идет о гуляющих в сети NT4/Win2K - так они не полные,
да и в официальных WRK тоже очень многое вырезано.
0
2 / 2 / 1
Регистрация: 06.05.2011
Сообщений: 126
22.10.2013, 20:43  [ТС]
Да, конечно, именно эти неполные я и имею в виду. Вопрос не в том, что там просто могут быть вырезаны фрагменты с соответствующими переопределениями, а в том, может ли быть, что такой синтаксис допустим в предположении, что переопределений на самом деле нет, но компиляторы за счет каких-то настроек такие функции с префиксами понимают и превращают в обычные
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8725 / 3677 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
22.10.2013, 21:27
Цитата Сообщение от Владимир В Посмотреть сообщение
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
2 / 2 / 1
Регистрация: 06.05.2011
Сообщений: 126
22.10.2013, 22:01  [ТС]
Так в том-то и дело, что функция названа xxxSendMessage(). А в приложениях она (или не она?) вызывается под именем SendMessage(). Если это она, то должно же быть где-то что-то вроде :
#define GetMessage(lpmsg, hwnd, wMsgMin, wMsgMax) \
xxxGetMessage(lpmsg, hwnd, wMsgMin, wMsgMax)
???
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8725 / 3677 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
22.10.2013, 22:04
Цитата Сообщение от Владимир В Посмотреть сообщение
или не она
Не она. xxxSendMessage - функция ядра (Kernel mode, находится в win32k.sys), SendMessage - функция пользовательского режима (User mode, находится в user32.dll).
0
2 / 2 / 1
Регистрация: 06.05.2011
Сообщений: 126
23.10.2013, 21:32  [ТС]
Тогда как понять то, что всякие источники, если они перечисляют функции модуля 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
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8725 / 3677 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
23.10.2013, 22:03
Цитата Сообщение от Владимир В Посмотреть сообщение
Или из за того, что эти функции неэкспортируемые
Именно.
Цитата Сообщение от Владимир В Посмотреть сообщение
user32.def
Это файл описывающий список экспортируемых функций.
Цитата Сообщение от Владимир В Посмотреть сообщение
есть комментарий
В нём не говорится где расположены эти функции (в каком файле с кодом), а судя по всему это комментарий к содержимому этого файла: "API для отправки оконных сообщений и вспомогательные процедуры", о том что там должны располагаться функции описанные ниже ничего не говорится. В самом же начале def файла написано к какой библиотеке файл относится: LIBRARY USER32
Да и как-бы расположение файла "sendmsg.c" - "\ntuser\kernel" намекает на то к чему относятся функции, остальные комментарии в файле говорят о том же самом. Сомневаюсь что разработчики стали бы пихать функции Kernel и User mode в один файл.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.10.2013, 22:03
Помогаю со студенческими работами здесь

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

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

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

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

Кaк в 'select from xxx where xxx =' вписaть стрингoвую переменную пoсле рaвнo?
Кaк в 'select from xxx where xxx =' вписaть стрингoвую переменную пoсле рaвнo? Кaкoй синтaксис,a тo oн мне все время ругaется o Syntax...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru