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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: 1 [2]  Все   Вниз
  Печать  
Автор Тема: Хелп. Блокировка LPT и COM порта.  (Прочитано 44633 раз)
0 Пользователей и 3 Гостей смотрят эту тему.
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #30 : 21-05-2007 13:45 » 

FDO - \Device\ParallelPort0
PDO - \Device\Parallel0
вроде так.
FDO - \Device\Serial0 - соответственно...
если не путаю...
« Последнее редактирование: 21-05-2007 13:49 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
good3p
Гость
« Ответ #31 : 21-05-2007 14:03 » 

спасибо. но таких устройств у меня не оказалось. попробую на другой машине.

в общем еще вопрос. затестил я устройство beep - оно пипикало, но после работы моего драйвера, перестало, значит всё хорошо, будет работать и для других устройств.

в моем задании есть условие что раз я остановил работу какого-то устройства, то только я должен её и продолжить. то есть по моей команде драйвер должен переставать мешать. и тут то самое интересное - можно его выгружать, а можно начать передавать IRP пакеты нижележащему драйверу в стеке. с выгрузкой, насколько я понял из общения с умным человеком, я замучаюсь. впринципе я это уже проверил - выгружаю драйвер, пытаюсь бибикнуть, и вылетает синя смертушка. впринципе всё ясно - пакет летит на мой фильтр, ведь система не знает что фильтра уже нету. тут похоже надо как-то обновить стек, чтобы все проходило гладко.
думаю проще будет научить драйвер передавать пакеты нижнему. не подскажите как это сделать? (или проще правильно выгрузить свой драйвер?)

спасибо!
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #32 : 21-05-2007 14:37 » 

IoSkipCurrentIrpStackLocation (Irp);
IoCallDriver(LowerDevice, Irp);
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
good3p
Гость
« Ответ #33 : 22-05-2007 05:43 » new

в общем начались мучения) надоело мне наблюдать синюю смерть и опять я за советом. мой драйвер передает пакеты ниже, т.е. писиспикер бибикает, и через секунду улетает в синий экран) вот кусок кода:

было так и блокировало. хочу добиться обратного - не блокировать.
Код:
switch (ioControlCode)

  case...
  ...
  default:
  {
#if DBG
DbgPrint("-myDrvC- chto? kto tut komu meshajet?(1)...\n");
#endif
      Irp->IoStatus.Status = STATUS_INVALID_PARAMETER;
      break;
  }
}
ntStatus = Irp->IoStatus.Status;
IoCompleteRequest(Irp, IO_NO_INCREMENT);  //Для завершения IRP-пакета
return ntStatus;
}


делаю так, чтобы передавало ниже: (что тут не правильно)
Код:
...
switch (ioControlCode)
{  ...
   case..

   case...

   default:{
#if DBG
DbgPrint("-myDrvC- peredacha vniz.(1)...\n");
#endif
        //Irp->IoStatus.Status = STATUS_INVALID_PARAMETER;
IoSkipCurrentIrpStackLocation (Irp); //
IoCallDriver(temp_vniz, Irp);  //
        break;
  }
  }
 
  ntStatus = Irp->IoStatus.Status;
  //IoCompleteRequest(Irp, IO_NO_INCREMENT);  //Для завершения IRP-пакета
  return ntStatus;
}

также бывает после синей смерти драйвер напроч отказывается загружаться (перезагрузка и чистка реестра помогает). либо загружается но глючит общение с ним по ioctl кодам.
спасибо!
« Последнее редактирование: 22-05-2007 05:52 от good3p » Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #34 : 22-05-2007 07:03 » 

можно еше
   Irp->IoStatus.Status = STATUS_NOT_SUPPORTED;
а возвращать лучше все таки:
    return STATUS_SUCCESS;
хотя черт его знает...


остальное должно быть не совсем так:
Код:
        Irp->IoStatus.Status = STATUS_SUCCESS;//здесь ты выставляешь свой статус. и передаешь ниже. если этого не сделать - вызов хоть и пройдет через стек но не....)))           
        IoSkipCurrentIrpStackLocation (Irp);
        status = IoCallDriver(devExt->LowerDevice, Irp);
        return status;


Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
good3p
Гость
« Ответ #35 : 22-05-2007 12:15 » 

спасибо за помощь. в общем решил я всетаки не мудрить и сделать правильную выгрузку драйвера. драйвер есть - нужные девайсы не работают. выгрузил - работают.
в общем как ситуация обстоит сейчас=) :
получаю поинтер на девайс beep (RtlInitUnicodeString(&usFatDriverObj[4], L"\\Device\\Beep")Ага
Код:
ntStatus = IoGetDeviceObjectPointer(
        &usFatDriverObj[4],               //ObjectName
        //FILE_READ_DATA,                //DesiredAccess
FILE_READ_ATTRIBUTES,
        OUT &lpFileObject[4],                 //FileObject
        OUT &lpDeviceObject[4]);              //DeviceObject
присоединяю свой драйвер к этому устройству:
Код:
IoAttachDeviceToDeviceStack ( IN deviceObject, IN lpDeviceObject[4]);

все хорошо, все работает. теперь выгружаю драйвер:
Код:
VOID
DriverUnload(IN PDRIVER_OBJECT DriverObject)
{
  UNICODE_STRING deviceLinkUnicodeString;
  PDEVICE_EXTENSION extension;
  PIRP pNewIrp = NULL;
  ULONG m_size;
  NTSTATUS  ntStatus;
  extension = DriverObject->DeviceObject->DeviceExtension;
 
//===================================  !!!!!!!!


IoDetachDevice(IN OUT lpDeviceObject[4]);


ObDereferenceObject(IN lpDeviceObject[4]);


//=====================================!!!!!!!!!!!!!
  // Create counted string version of our Win32 device name.
  RtlInitUnicodeString(&deviceLinkUnicodeString, DOS_DEVICE_NAME);


  // Delete the link from our device name to a name in the Win32 namespace.
  IoDeleteSymbolicLink(&deviceLinkUnicodeString);


  // Finally delete our device object
  IoDeleteDevice(DriverObject->DeviceObject);
  }
и вот что странно.
1 раз загружаю драйвер. все хорошо бибикалка не работает.
1 раз выгружаю - работает.
2 раз загружаю - не работает.
2 раз выгружаю.
вроде бы все хорошо, но вот когда запускаю бибикалку или пытаюсь посмотреть дерево в devicetree.exe - синяя смерть. почему ? ведь один цикл загрузки-выгрузки-загрузки прощел успешно. не понимаю.

спасибо!
Записан
good3p
Гость
« Ответ #36 : 22-05-2007 14:43 » 

УРА!
в общем помучался я с выгрузкой и решил сделать через флажок. т.е. если флаг == 1 то передаю пакеты ниже, если ==0 то не делаю ничего.

вот код главной функции DriverDeviceControl: может будет полезно таким же новичкам как и я.
если что пишите сюда могу запостить весь код как драйвера так и приложения работающего с ним. всем спасибо!
Код:
//Эта функция вызывается каждый раз, когда драйверу приходит IRP-пакет с каким либо IOCTL_ кодом. 
//IRP-пакет - это структура, передавая указатель на которую, приложение может общаться с драйвером


NTSTATUS
DriverDeviceControl(IN PDEVICE_OBJECT DeviceObject,
                    IN PIRP Irp)
{
  NTSTATUS ntStatus;
  PIO_STACK_LOCATION irpStack; //irpStack типа указателя на стековую область ввода-вывода PIO_STACK_LOCATION
  PDEVICE_EXTENSION extension;
  PULONG ioBuffer; //ioBuffer, в которую будет помещен адрес системного буфера обмена/ type mpzet bit drugim esli 40
  ULONG ioControlCode;
  ULONG port = 0;     
  int i;












  Irp->IoStatus.Status = STATUS_SUCCESS;
  Irp->IoStatus.Information = 0;
  irpStack = IoGetCurrentIrpStackLocation(Irp); //в переменную irpStack помещается адрес стековой области ввода-вывода
//
  extension = DeviceObject->DeviceExtension;
  ioBuffer = Irp->AssociatedIrp.SystemBuffer; // в переменную ioBuffer заносится адрес системного буфера из структуры IRP
// Системный буфер входит в объединение (union) с именем AssociatedIrp,
// поэтому мы используем конструкцию Irp->AssociatedIrp.SystemBuffer

  ioControlCode = irpStack->Parameters.DeviceIoControl.IoControlCode;
  //Конструкция switch-case анализирует содержимое ячейки IoControlCode

  //В нашей программе только один код действия TEST_SMTH
  switch (ioControlCode)
  { 
  case TEST_SMTH:                 
  {
       ioBuffer[0] =(ULONG)DriverEntry;//В буфер обмена адрес функции DriverEntry
         Irp->IoStatus.Information = 4;//количество (4) пересылаемых байт
       
#if DBG
DbgPrint("-myDrvC- obrabotal TEST_SMTH.\n");
#endif




ntStatus = Irp->IoStatus.Status;
  IoCompleteRequest(Irp, IO_NO_INCREMENT);  //Для завершения IRP-пакета bez nejo test vozvrashiajet 0000000





break;
 
  }
 
 
  case IOCTL_SEND_BYTE_TO_USER: // шлём байтик юзерскому приложению
  {
       
ioBuffer[0] =(ULONG)("YES!");//В буфер обмена адрес функции DriverEntry
         Irp->IoStatus.Information = 4;//количество (4) пересылаемых байт
       
#if DBG
DbgPrint("-myDrvC- obrabotal IOCTL_SEND_BYTE_TO_USER.\n");
#endif

ntStatus = Irp->IoStatus.Status;
  IoCompleteRequest(Irp, IO_NO_INCREMENT);  //Для завершения IRP-пакета bez nejo test vozvrashiajet 0000000

if (GlobalFlag==0) GlobalFlag = 1;
else GlobalFlag = 0;

DbgPrint("-myDrvC- obrabotal IOCTL_SEND_BYTE_TO_USER. GlobalFlag stal:%d.\n",GlobalFlag);



break;

  }






default:


  {

DbgPrint("-myDrvC- popali v default!...)))))\n");

        if (GlobalFlag==0)
{
 
Irp->IoStatus.Status = STATUS_INVALID_PARAMETER;
DbgPrint("-myDrvC- MESHAJU!)))))\n");
}
if (GlobalFlag==1)
{
Irp->IoStatus.Status = STATUS_SUCCESS;

IoSkipCurrentIrpStackLocation (Irp); //yo

DbgPrint("-myDrvC- NE MESHAJU!)))))\n");
IoCallDriver(LowLevel, Irp);  //beep yo
}


        break;
}

  }
 
DbgPrint("-myDrvC- vniz test GF(%d)!)))))\n",GlobalFlag);

  ntStatus = Irp->IoStatus.Status;
  //IoCompleteRequest(Irp, IO_NO_INCREMENT);  //Для завершения IRP-пакета bez nejo test vozvrashiajet 0000000
  return ntStatus;
}
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #37 : 23-05-2007 07:49 » 

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

еще. ты уверен что твои IOCRL с родными по номерам не пересекаются? вдруг попал пальцем в небо)

а вообще - молодцом) быстро разобрался) зато теперь BSOD во сне видеть будешь ближайщие пол года)))
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
batanik
Гость
« Ответ #38 : 01-06-2007 13:23 » 

Как изменить код для блокировки Floppy и CD-Rom? А черт его знает...
Заранее спасибо.
Записан
Страниц: 1 [2]  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines