Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
Страниц: 1 ... 5 6 7 [8] 9 10
 71 
 : 10-01-2025 14:45 
Автор WWX - Последний ответ от WWX
Ух, большое спасибо за развёрнутый ответ.

Я не указал, что перед этой ф-цией у него стоит директива:
Код: (C++)
#pragma LOCKEDCODE
чем по идее и обеспечивается невыгружаемость; но, похоже, сути дела это не меняет.

На самом деле эта ф-ция, говоря простым языком, – обработчик IOCTL'ов и вызывается, как я понимаю, на уровне PASSIVE_LEVEL.
Т. е. с одной стороны когда управление "проходит" по этому (PAGED_CODE) макросу – IRQL не слишком высокий, но ненадолго повысится вдальнейшем внутри этой ф-ции.
(Похоже что, почти нашёл почти ошибку у самого Они.)

Как я понял по вашим ссылкам, по-умолчанию ф-ция и так размещается в неперемещаемой памяти, если не указывать чего-то вроде:
Код: (C)
#pragma alloc_text(PAGE, DispatchControl)

Правда у меня возникла небольшая параноя:
Если переменная oldirql (в которой сохраняется старый IRQL) объявлена как локальная в этой (DispatchControl) ф-ции (а где бы ей ещё быть?), так вот, если она объявлена как локальная, то может ли так получиться, что на момент вызова
Код: (C++)
KeReleaseSpinLock(..., oldirql);
она (переменная) будет выгружена из памяти?

Т. е. сама ф-ция вроде бы помещается в .text который будет гарантированно в невыгружаемой памяти. А есть ли гарантия, что её локальные данные также будут в невыгружаемой памяти? (Ведь на момент вызова KeReleaseSpinLock – IRQL должен быть DISPATCH_LEVEL.)

 72 
 : 10-01-2025 12:01 
Автор WWX - Последний ответ от Ochkarik
доброго!
Вообще этого не корректно. в смысле макрос проверки PAGED_CODE() поставлен некорректно...
PAGED_CODE — это контроль того, что функция выполняется на IRQL < DISPATCH_LEVEL, это работает только в checked-версии. просто немного упрощает отлов ошибок, связанных с выполнением кода на недопустимо высоком IRQL. Ну и вообще код более читабельный, видим макрос в начале функции, и ясно, что на DISPATCH_LEVEL ее вызывать не надо.

А главное при компиляции необходимо указать, что функцию DispatchControl() необходимо разместить в nonpaged секции (.text называлась). Делал при помощи #pragma:

Код: (C)
#pragma alloc_text(INIT, DriverEntry)
#pragma alloc_text(PAGE, DriverUnload)
#pragma alloc_text(PAGE, AddDevice)
#pragma alloc_text(PAGE, DispatchSystemControl)
#pragma alloc_text(PAGE, CommonDispatch)
#pragma alloc_text(TEXT, HwInt_01)
последний - как раз размещение функции обработчика прерывания HwInt_01( IN PKINTERRUPT Interrupt,  IN PDEVICE_EXTENSION_MY devExt) в nonpaged секции(.text).
ну и в ключах линкера необходимо так же указать слияние секций...
Код:
 -MERGE:_PAGE=PAGE -MERGE:_TEXT=.text -SECTION:INIT,d 
-MERGE:.rdata=.text -optidata -driver -align:0x20 -osversion:5.00 -subsystem:native,1.10 -driver:WDM -debug:notmapped,MINIMAL
это копипаста из моего старого проекта pci драйвера там помоему в отдельной строке было задано.
вот тут чуть подробнее наверное Блокировка страничного кода или данных на microsoft.com

ЗЫ Making Drivers Pageable
Цитата
By default, the linker assigns names such as ".text" and ".data" to the code and data sections of a driver image file. When the driver is loaded, the I/O manager makes these sections nonpaged. A nonpaged section is always memory-resident.
ЗЗЫ Locking Pageable Code or Data
Цитата
To isolate the pageable code into a named section, mark it with the following compiler directive:

#pragma alloc_text(PAGE*Xxx, *RoutineName)

The name of a pageable code section must start with the four letters "PAGE" and can be followed by up to four characters (represented here as Xxx) to uniquely identify the section. The first four letters of the section name (that is, "PAGE") must be capitalized. The RoutineName identifies an entry point to be included in the pageable section.

 73 
 : 09-01-2025 21:15 
Автор mikkijon - Последний ответ от mikkijon
Приветствую Друзья
И снова обращаюсь к Вам за помощью. Так как опять запутался по хождению нашей всемирной сети...... Суть проблемы в следующем... Я изучаю "Оконные приложения Python 3 и PyQt6", автор Прохорёнок Н.А. и Дронов В.А. Пройдя три главы а именно:
Глава 18.9. - Вывод заставки
Глава 19.5. - Разворачивание и сворачивание окон
Глава 19.6. - Управление прозрачностью окна

Я решил соединить листинги из этих глав....

Код: (Python)
from PyQt6 import QtCore, QtWidgets, QtGui
import time
class MyWindow(QtWidgets.QWidget):
    def __init__(self, parent=None):
        QtWidgets.QWidget.__init__(self, parent)
        self.btnMin = QtWidgets.QPushButton("Свернуть")
        self.btnMax = QtWidgets.QPushButton("Развернуть")
        self.btnFull = QtWidgets.QPushButton("Полный экран")
        self.btnNormal = QtWidgets.QPushButton("Нормальный размер")
        vbox = QtWidgets.QVBoxLayout()
        vbox.addWidget(self.btnMin)
        vbox.addWidget(self.btnMax)
        vbox.addWidget(self.btnFull)
        vbox.addWidget(self.btnNormal)
        self.setLayout(vbox)
        self.btnMin.clicked.connect(self.on_min)
        self.btnMax.clicked.connect(self.on_max)
        self.btnFull.clicked.connect(self.on_full)
        self.btnNormal.clicked.connect(self.on_normal)
    def on_min(self):
        self.showMinimized()
    def on_max(self):
        self.showMaximized()
    def on_full(self):
        self.showFullScreen()
    def on_normal(self):
        self.showNormal()
    def load_data(self, ap):
        for i in range(1, 20): # Имитируем процесс
            time.sleep(20000) # Что-то загружаем
            ap.showMessage("Загрузка данных...(0%)".format(i*10),
                           QtCore.Qt.AlignmentFlag.AlignHCenter|
                           QtCore.Qt.AlignmentFlag.AlignBottom,
                           QtCore.Qt.GlobalColor.red)
            # Принудительно обрабатываем события
            QtWidgets.QApplication.instance().processEvents()
if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    window = MyWindow()
    window.setWindowTitle("Разворачивание и сворачивание окон")
    window.resize(300, 100)
    splash = QtWidgets.QSplashScreen(QtGui.QPixmap("screen2.jpg"))
    splash.showMessage("Загрузка данных... (0)%",
                       QtCore.Qt.AlignmentFlag.AlignHCenter |
                       QtCore.Qt.AlignmentFlag.AlignBottom,
                       QtGui.QColor("red"))
    splash.show()
    QtWidgets.QApplication.instance().processEvents()
    window.show()
    splash.finish(window)
    sys.exit(app.exec())
Все получилось кроме заставки..... окно появляется и тут же исчезает (также высылаю Вам сам программу)

Помогите пожалуйста разобраться ....
Заранее благодарю

 74 
 : 09-01-2025 14:09 
Автор WWX - Последний ответ от WWX
В одном из примеров, прилагаемых к книге У. Они, замечен следующий код:
Код: (C++)
NTSTATUS DispatchControl(PDEVICE_OBJECT fdo, PIRP Irp)
        {
        PAGED_CODE();
...
        KeAcquireSpinLock(&pdx->eventlock, &oldirql);
...
        }
Но в описании ф-ции KeAcquireSpinLock:
The code within a critical region guarded by an spin lock must neither be pageable nor make any references to pageable data.

Вроде бы можно предположить, что часть расположенного после захвата спин-блокировки кода может отсутствовать в памяти. И т. к. IRQL после захвата будет слишком высок для страничного сбоя, то будет просто сбой?
Вероятность этого конечно очень мала, но всё же...

(Скорее всего я что-то упускаю из вида, и хотелось бы понять что именно...)

 75 
 : 01-01-2025 15:32 
Автор Assol - Последний ответ от Люсь
Интересный дискусс.

 76 
 : 25-12-2024 14:08 
Автор WWX - Последний ответ от WWX
Согласен.
Хотя, на мой взгляд, под Linux драйвера легче пишутся (несколько лет, правда, не писал таких...)
А вот под user space лично мне кодить больше прёт именно под Windows.

 77 
 : 24-12-2024 16:18 
Автор WWX - Последний ответ от Ochkarik
WWX, и я не линуксоид) каждый раз когда сталкиваюсь чисто пользовательски, на принтер прошивку поставить - меня в ужас приводит каждое действие, легко неделями разбираться надо каждым необходимым действием... один раз делал простейшие действия по инструкции, а она оказалась от другой версии ядра)
PS и да, иногда простейшее действия вызывают массу сложностей))) но зато документация все таки есть и подходит как правило начиная от  98-го  до 10тки)

 78 
 : 24-12-2024 09:15 
Автор WWX - Последний ответ от WWX
Похоже, что да – в Windows'е это делается только напрямую через конфигурационное пространство (просто в Linux'е для этой конкретной операции сделали отдельную ф-цию).

Спасибо за подсказку, будем выкручиваться...

(PS: Я ни разу не линуксоид, и многие вещи мне больше нравятся как они сделаны в Windows'е, нежели в Linux'е. Но справедливости ради тот же доступ к конфигурационному пространству на Linux'е занимает несколько строк, а на Windows'е у меня в своё время занял несколько экранов кода... (Если не путаю, использовал метод "The BUS_INTERFACE_STANDARD bus interface", правда рабочую ссылку на статью, где это (на мой взгляд) более подробно разжёвано чё-то не могу найти, а то бы скинул; могла бы кому-нибудь пригодиться.))

 79 
 : 23-12-2024 15:00 
Автор WWX - Последний ответ от Ochkarik
WWX, ну так "отключение прерываний в линуксе" - не то же самое, как если вы сами в обработчике просто обрабатывать перестанете?
кроме того... ну вот возникнет в линуксе необработанное прерывание от замаскированного устрйосва. Завесит наглухо аппаратную линию. Отвалится другое устройство на этой линии, точнее ему все время валится чужое прерывание, система наглухо останется в обработчике аппаратного прерывания.
И кто прав? ядро линукса которое такое в принципе позволяет для данной аппаратной платформы, или писатель драйвера который эту функцию применил не по делу(а почему нет, ядро же позволяет)?


Я не помню, в PCI через конфиг-спейс можно прерывание маскировать?

ЗЫ посмотрел, pci_intx() ставит отправляет команду в PCI регистр PCI_COMMAND устройства, в регистр конфигспейса.
флаг PCI_COMMAND_INTX_DISABLE   (1 << 10) /* INTx Emulation Disable */

а еще есть команда
Код:
static inline bool pci_intx_mask_supported(struct pci_dev *pdev)
{
/*
* INTx masking is supported if PCI_COMMAND_INTX_DISABLE is
* writable and no quirk has marked the feature broken.
*/
return !pdev->broken_intx_masking;
}

вроде можно самому
https://learn.microsoft.com/en-us/windows-hardware/drivers/pci/accessing-pci-device-configuration-space

 80 
 : 21-12-2024 02:08 
Автор Ksereox - Последний ответ от Ksereox
Вакансия всё ещё актуальна! Ждём ВАШИ заявки!

Страниц: 1 ... 5 6 7 [8] 9 10
Powered by SMF 1.1.21 | SMF © 2015, Simple Machines