Почему? Я щас ковыряюсь в одной программе и наткнулася на вызов API-функции EnterCriticalSection, почитал про неё и не понял, а где же самое главное- адрес и размер критической секции, которую, она, собсно и должна "захватить"? Вот структура, указатель на которую она принимает, она у меня так объявлена в Winbase.h Код (Text): typedef struct _CRITICAL_SECTION { PCRITICAL_SECTION_DEBUG DebugInfo; LONG LockCount; LONG RecursionCount; HANDLE OwningThread; HANDLE LockSemaphore; DWORD SpinCount; } CRITICAL_SECTION,*PCRITICAL_SECTION,*LPCRITICAL_SECTION; , тут нет ти указателя на секцию, ни её размера. Спасибо, кто откликнется!
amvoz Критическая секция — двусмысленное понятие. Как структура данных (приведенная Вами) она имеет и указатель, и размер. Если под критической секцией понимается область кода, в которую нельзя заходить дважды, то для неё понятия указателя и размера бессмысленны, т.к. точек захвата/освобождения соответствующей критической секции, как структуры данных, может быть множество, причём в несвязанных кусках кода.
Ну, хорошо. Вот у меня после вызова EnterCriticalSection будет адрес cafebabe- как я определю, принадлежит он критической секции или нет?
amvoz Определённый адрес одного и того же кода может принадлежать критической секции в один момент времени, и не принадлежать в другой. Для реализации критических секций структуре критической секции адрес последнего её захвата абсолютно не нужен.
amvoz Это ссылка на обьект. Вам и не нужно знать принадлежит она кс или нет. Вы должны использовать только свою кс, адрес которой всегда известен. Если вам необходимо проверить произвольную ссылку на принадлежность кс, то такая возможность есть. Нэйтив ведёт список секций. Получаем слепок через RtlQueryProcessLockInformation() или RtlQueryProcessDebugInformation(PDI_LOCKS) и находим там свой адрес.