Может кто подскажет как интегрировать DDK в VS 2005? В гуугле собственно такие вещи есть, например Однако пункт 3 осилить не могу. Точнее в настройках VS не могу найти место для подключения).
jerec Tools->Options->Projects and Solutions->VC++ Directories->Show directories for Выбираете конкретный раздел, и добавляете нужные вам пути. Это один из вариантов. Можно же туда ничего не прописывать, а пути прописать в свойствах Компилятора и Линкера, в настройках проекта.
Проще всего прописать в Tools/Options/..../VC++ Directories, но тогда придется при переносе проектов и студии для настроенной студии один раз сделать экспорт настроек (Tools -> Import and export settings), поставить галочку, чтобы она использовала их как "team settings" (типа одни на всех кодеров), что довольно геморройно. Зато в файле проекта не висят некрасивые пути к инклудам и либам. Либо можно не менять настроек студии, а все делать в настройках проекта. Это как-то более дзенно, будет компилироваться, куда бы ты не принес свой .vcproj/.sln с исходниками, но мне так не нравится - придется тогда пути задавать вида %WINDDK%\inc\crt и тп, нужна настройка переменных окружения. Опять же, что-то придется менять. Я лично предпочитаю вариант ничего не трогать в проекте (additional library paths/additional include paths), а выставлять всё один раз при установке студии в Tools/Options/.../VC++ Directories. Как-то красивее это
А мне больше нравится более простой вариант - создавать в Студии makefile-проект и для сборки использовать ddkbuild (http://www.osronline.com/article.cfm?article=43), но, бесспорно, прописав все директории с инклюдами, дабы использовать всю мощь intellisense)
Скачивал отсюда VisualDDK, интегрируетс в VisualStudio и имеется возможность создать solution "как обычно" (http://www.brothersoft.com/publisher/sysprogs.html). Отладчик глючит, но для создания проектов мастером - вполне пригодная тулза. Хорошее начинание, жаль не развивается (вроди).
Добрый день. Возможно глупый вопрос, но что нужно читать перед Руссиновичем? Говоря яснее -- какие знания нужно иметь, чтобы начать заниматься разработкой драйверов? Я неплохо знаю С++(именно С++, а не С). На каком уровне нужно знать ассемблер? Стоит ли читать Руссиновича с _минимальными_ знаниями ассемблера? И что еще нужно знать? Зарание благодарен.
sl0n +100500 Поубивал бы всех, кто советует Солдатова. Это просто ппц. (извините, не выдержал) bug1z Вам Руссинович сайчас нафиг не нужен. А что читать, вам уже в хипе посоветовали. Солдатова выкиньте.
C4sh надо переформулировать вопрос на "что там хорошего?" и по молчанию будет всё понятно( школьников не учитываем)
C4sh самое лучшее на русском это Уолтер Онни. полностью раскрывает тему и радует разными мелкими подробностями и нюансами
Взял проект драйвера из статьи http://alter.org.ua/ru/docs/nt_kernel/vc8_proj/ студии 2008. вознили проблемки 1. часть путей у меня в ddk по другому называется а не которых и нет. на пример (папки wxp в директории inc\ddk ) в общем эту проблему решил немного изменив пути. 2. При компиляции возникают ошибки: где искать эти функи ?...
все оказалось проще простого)) сменив в проекте : #define _WIN32_WINNT 0x0400 на #define _WIN32_WINNT 0x0500 все собралось
Код (Text): #include "precomp.h" #include <initguid.h> #include <ntddser.h> #include "timeout.h" #include "delay.h" #include "bufutils.h" #include "strutils.h" #include "showport.h" /* * FILE_ID used by HALT_UNLESS to put it on BSOD */ #define FILE_ID 6 NTSTATUS InitCommonExt( PC0C_COMMON_EXTENSION pDevExt, IN PDEVICE_OBJECT pDevObj, short doType, PWCHAR pPortName) { pDevExt->pDevObj = pDevObj; pDevExt->doType = doType; return CopyStrW(pDevExt->portName, sizeof(pDevExt->portName)/sizeof(pDevExt->portName[0]), pPortName); } VOID RemoveFdoPort(IN PC0C_FDOPORT_EXTENSION pDevExt) { if (pDevExt->pIoPortLocal) { FreeTimeouts(pDevExt->pIoPortLocal); FreeWriteDelay(pDevExt->pIoPortLocal); pDevExt->pIoPortLocal->plugInMode = FALSE; pDevExt->pIoPortLocal->exclusiveMode = FALSE; pDevExt->pIoPortLocal->pDevExt = NULL; FreeTxBuffer(&pDevExt->pIoPortLocal->txBuf); pDevExt->pIoPortLocal->brokeChars = 0; /* reset on idle */ } if (!HidePort(pDevExt)) SysLog(pDevExt->pDevObj, STATUS_UNSUCCESSFUL, L"RemoveFdoPort HidePort FAIL"); if (pDevExt->symbolicLinkName.Buffer) RtlFreeUnicodeString(&pDevExt->symbolicLinkName); StrFree(&pDevExt->ntDeviceName); StrFree(&pDevExt->win32DeviceName); if (pDevExt->pLowDevObj) IoDetachDevice(pDevExt->pLowDevObj); Trace0((PC0C_COMMON_EXTENSION)pDevExt, L"RemoveFdoPort"); IoDeleteDevice(pDevExt->pDevObj); } NTSTATUS AddFdoPort(IN PDRIVER_OBJECT pDrvObj, IN PDEVICE_OBJECT pPhDevObj) { NTSTATUS status; UNICODE_STRING portName; PDEVICE_OBJECT pNewDevObj; PC0C_FDOPORT_EXTENSION pDevExt; PC0C_PDOPORT_EXTENSION pPhDevExt; ULONG emuBR, emuOverrun, plugInMode, exclusiveMode, hiddenMode; ULONG brokeCharsProbability; ULONG addRTTO, addRITO; ULONG pinCTS, pinDSR, pinDCD, pinRI; UNICODE_STRING ntDeviceName; PWCHAR pPortName; status = STATUS_SUCCESS; pDevExt = NULL; RtlInitUnicodeString(&portName, NULL); RtlInitUnicodeString(&ntDeviceName, NULL); StrAppendDeviceProperty(&status, &ntDeviceName, pPhDevObj, DevicePropertyPhysicalDeviceObjectName); if (!NT_SUCCESS(status)) { SysLog(pPhDevObj, status, L"AddFdoPort IoGetDeviceProperty FAIL"); goto clean; } pPhDevExt = (PC0C_PDOPORT_EXTENSION)pPhDevObj->DeviceExtension; if (!pPhDevExt || pPhDevExt->doType != C0C_DOTYPE_PP) { status = STATUS_UNSUCCESSFUL; SysLog(pPhDevObj, status, L"AddFdoPort FAIL. Type of PDO is not PP"); goto clean; } Trace00((PC0C_COMMON_EXTENSION)pPhDevExt, L"AddFdoPort for ", ntDeviceName.Buffer); pPortName = pPhDevExt->portName; if (!*pPortName) { status = STATUS_UNSUCCESSFUL; SysLog(pPhDevObj, status, L"AddFdoPort FAIL. The PDO has invalid port name"); goto clean; } { UNICODE_STRING portRegistryPath; RtlInitUnicodeString(&portRegistryPath, NULL); StrAppendStr(&status, &portRegistryPath, c0cGlobal.registryPath.Buffer, c0cGlobal.registryPath.Length); StrAppendStr0(&status, &portRegistryPath, L"\\Parameters\\"); StrAppendStr0(&status, &portRegistryPath, pPortName); if (NT_SUCCESS(status)) { WCHAR portNameBuf[C0C_PORT_NAME_LEN + 1]; UNICODE_STRING portNameTmp; RTL_QUERY_REGISTRY_TABLE queryTable[2]; RtlZeroMemory(queryTable, sizeof(queryTable)); portNameTmp.Length = 0; portNameTmp.MaximumLength = sizeof(portNameBuf); portNameTmp.Buffer = portNameBuf; queryTable[0].Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_QUERY_REGISTRY_REQUIRED; queryTable[0].Name = L"PortName"; queryTable[0].EntryContext = &portNameTmp; status = RtlQueryRegistryValues( RTL_REGISTRY_ABSOLUTE, portRegistryPath.Buffer, queryTable, NULL, NULL); if (!NT_SUCCESS(status) || !portNameTmp.Length) { status = STATUS_SUCCESS; StrAppendStr0(&status, &portName, pPortName); } else { StrAppendStr(&status, &portName, portNameTmp.Buffer, portNameTmp.Length); Trace00((PC0C_COMMON_EXTENSION)pPhDevExt, L"PortName set to ", portName.Buffer); } } emuBR = C0C_DEFAULT_EMUBR; emuOverrun = C0C_DEFAULT_EMUOVERRUN; plugInMode = C0C_DEFAULT_PLUGINMODE; exclusiveMode = C0C_DEFAULT_EXCLUSIVEMODE; hiddenMode = C0C_DEFAULT_HIDDENMODE; pinCTS = C0C_DEFAULT_PIN_CTS; pinDSR = C0C_DEFAULT_PIN_DSR; pinDCD = C0C_DEFAULT_PIN_DCD; pinRI = C0C_DEFAULT_PIN_RI; brokeCharsProbability = C0C_DEFAULT_EMUNOISE; addRTTO = C0C_DEFAULT_ADDRTTO; addRITO = C0C_DEFAULT_ADDRITO; if (NT_SUCCESS(status)) { RTL_QUERY_REGISTRY_TABLE queryTable[13]; int i; RtlZeroMemory(queryTable, sizeof(queryTable)); for (i = 0 ; i < (sizeof(queryTable)/sizeof(queryTable[0]) - 1) ; i++) { queryTable[i].Flags = RTL_QUERY_REGISTRY_DIRECT; queryTable[i].DefaultType = REG_DWORD; queryTable[i].DefaultLength = sizeof(ULONG); } i = 0; queryTable[i].Name = L"EmuBR"; queryTable[i].EntryContext = &emuBR; queryTable[i].DefaultData = &emuBR; i++; queryTable[i].Name = L"EmuOverrun"; queryTable[i].EntryContext = &emuOverrun; queryTable[i].DefaultData = &emuOverrun; i++; queryTable[i].Name = L"PlugInMode"; queryTable[i].EntryContext = &plugInMode; queryTable[i].DefaultData = &plugInMode; i++; queryTable[i].Name = L"ExclusiveMode"; queryTable[i].EntryContext = &exclusiveMode; queryTable[i].DefaultData = &exclusiveMode; i++; queryTable[i].Name = L"HiddenMode"; queryTable[i].EntryContext = &hiddenMode; queryTable[i].DefaultData = &hiddenMode; i++; queryTable[i].Name = L"cts"; queryTable[i].EntryContext = &pinCTS; queryTable[i].DefaultData = &pinCTS; i++; queryTable[i].Name = L"dsr"; queryTable[i].EntryContext = &pinDSR; queryTable[i].DefaultData = &pinDSR; i++; queryTable[i].Name = L"dcd"; queryTable[i].EntryContext = &pinDCD; queryTable[i].DefaultData = &pinDCD; i++; queryTable[i].Name = L"ri"; queryTable[i].EntryContext = &pinRI; queryTable[i].DefaultData = &pinRI; i++; queryTable[i].Name = L"EmuNoise"; queryTable[i].EntryContext = &brokeCharsProbability; queryTable[i].DefaultData = &brokeCharsProbability; i++; queryTable[i].Name = L"AddRTTO"; queryTable[i].EntryContext = &addRTTO; queryTable[i].DefaultData = &addRTTO; i++; queryTable[i].Name = L"AddRITO"; queryTable[i].EntryContext = &addRITO; queryTable[i].DefaultData = &addRITO; RtlQueryRegistryValues( RTL_REGISTRY_ABSOLUTE, portRegistryPath.Buffer, queryTable, NULL, NULL); } StrFree(&portRegistryPath); } if (!NT_SUCCESS(status)) { SysLog(pPhDevObj, status, L"AddFdoPort FAIL"); goto clean; } status = IoCreateDevice(pDrvObj, sizeof(*pDevExt), NULL, FILE_DEVICE_SERIAL_PORT, FILE_DEVICE_SECURE_OPEN, TRUE, &pNewDevObj); if (!NT_SUCCESS(status)) { SysLog(pPhDevObj, status, L"AddFdoPort IoCreateDevice FAIL"); goto clean; } HALT_UNLESS(pNewDevObj); pDevExt = pNewDevObj->DeviceExtension; HALT_UNLESS(pDevExt); RtlZeroMemory(pDevExt, sizeof(*pDevExt)); pDevExt->pIoPortLocal = pPhDevExt->pIoPortLocal; status = InitCommonExt((PC0C_COMMON_EXTENSION)pDevExt, pNewDevObj, C0C_DOTYPE_FP, portName.Buffer); if (!NT_SUCCESS(status)) { SysLog(pPhDevObj, status, L"AddFdoPort FAIL"); goto clean; } pDevExt->pIoPortLocal->pDevExt = pDevExt; if (emuBR) { if (NT_SUCCESS(AllocWriteDelay(pDevExt->pIoPortLocal))) Trace0((PC0C_COMMON_EXTENSION)pDevExt, L"Enabled baudrate emulation"); else SysLog(pPhDevObj, status, L"AddFdoPort AllocWriteDelay FAIL"); } else { Trace0((PC0C_COMMON_EXTENSION)pDevExt, L"Disabled baudrate emulation"); } if (emuOverrun) { pDevExt->pIoPortLocal->emuOverrun = TRUE; Trace0((PC0C_COMMON_EXTENSION)pDevExt, L"Enabled overrun emulation"); } else { pDevExt->pIoPortLocal->emuOverrun = FALSE; Trace0((PC0C_COMMON_EXTENSION)pDevExt, L"Disabled overrun emulation"); } if (plugInMode) { pDevExt->pIoPortLocal->plugInMode = TRUE; Trace0((PC0C_COMMON_EXTENSION)pDevExt, L"Enabled plug-in mode"); } else { pDevExt->pIoPortLocal->plugInMode = FALSE; Trace0((PC0C_COMMON_EXTENSION)pDevExt, L"Disabled plug-in mode"); } if (exclusiveMode) { pDevExt->pIoPortLocal->exclusiveMode = TRUE; Trace0((PC0C_COMMON_EXTENSION)pDevExt, L"Enabled exclusive mode"); } else { pDevExt->pIoPortLocal->exclusiveMode = FALSE; Trace0((PC0C_COMMON_EXTENSION)pDevExt, L"Disabled exclusive mode"); } SetHiddenMode(pDevExt, hiddenMode); pDevExt->pIoPortLocal->addRTTO = addRTTO; #if ENABLE_TRACING if (addRTTO) Trace0((PC0C_COMMON_EXTENSION)pDevExt, L"Enabled ReadTotalTimeoutConstant increase"); #endif /* ENABLE_TRACING */ pDevExt->pIoPortLocal->addRITO = addRITO; #if ENABLE_TRACING if (addRITO) Trace0((PC0C_COMMON_EXTENSION)pDevExt, L"Enabled ReadIntervalTimeout increase"); #endif /* ENABLE_TRACING */ AllocTimeouts(pDevExt->pIoPortLocal); RtlZeroMemory(&pDevExt->pIoPortLocal->specialChars, sizeof(pDevExt->pIoPortLocal->specialChars)); pDevExt->pIoPortLocal->specialChars.XonChar = 0x11; pDevExt->pIoPortLocal->specialChars.XoffChar = 0x13; RtlZeroMemory(&pDevExt->pIoPortLocal->handFlow, sizeof(pDevExt->pIoPortLocal->handFlow)); pDevExt->pIoPortLocal->handFlow.ControlHandShake = SERIAL_DTR_CONTROL; pDevExt->pIoPortLocal->handFlow.FlowReplace = SERIAL_RTS_CONTROL; pDevExt->pIoPortLocal->lineControl.WordLength = 7; pDevExt->pIoPortLocal->lineControl.Parity = EVEN_PARITY; pDevExt->pIoPortLocal->lineControl.StopBits = STOP_BIT_1; pDevExt->pIoPortLocal->baudRate.BaudRate = 1200; SetWriteDelay(pDevExt->pIoPortLocal); SetTxBuffer(&pDevExt->pIoPortLocal->txBuf, 1, TRUE); pDevExt->pIoPortLocal->modemControl |= C0C_MCR_OUT2; PinMap(pDevExt->pIoPortLocal, pinCTS, pinDSR, pinDCD, pinRI); pDevExt->pIoPortLocal->brokeCharsProbability = brokeCharsProbability; #if ENABLE_TRACING if (brokeCharsProbability) Trace0((PC0C_COMMON_EXTENSION)pDevExt, L"Enabled noise emulation"); else Trace0((PC0C_COMMON_EXTENSION)pDevExt, L"Disabled noise emulation"); #endif /* ENABLE_TRACING */ pDevExt->pLowDevObj = IoAttachDeviceToDeviceStack(pNewDevObj, pPhDevObj); if (!pDevExt->pLowDevObj) { status = STATUS_NO_SUCH_DEVICE; SysLog(pPhDevObj, status, L"AddFdoPort IoAttachDeviceToDeviceStack FAIL"); goto clean; } pNewDevObj->Flags &= ~DO_DEVICE_INITIALIZING; pNewDevObj->Flags |= DO_BUFFERED_IO; /* Create symbolic links to device */ RtlInitUnicodeString(&pDevExt->ntDeviceName, NULL); StrAppendStr0(&status, &pDevExt->ntDeviceName, ntDeviceName.Buffer); RtlInitUnicodeString(&pDevExt->win32DeviceName, NULL); StrAppendStr0(&status, &pDevExt->win32DeviceName, C0C_PREF_WIN32_DEVICE_NAME); StrAppendStr0(&status, &pDevExt->win32DeviceName, portName.Buffer); if (!NT_SUCCESS(status)) { StrFree(&pDevExt->win32DeviceName); StrFree(&pDevExt->ntDeviceName); SysLog(pPhDevObj, status, L"AddFdoPort StrAppendStr0 FAIL"); } status = IoRegisterDeviceInterface(pPhDevObj, (LPGUID)&GUID_CLASS_COMPORT, NULL, &pDevExt->symbolicLinkName); if (!NT_SUCCESS(status)) { SysLog(pPhDevObj, status, L"AddFdoPort IoRegisterDeviceInterface FAIL"); pDevExt->symbolicLinkName.Buffer = NULL; } if (!pDevExt->pIoPortLocal->plugInMode || pDevExt->pIoPortLocal->pIoPortRemote->isOpen) { if (!ShowPort(pDevExt)) SysLog(pDevExt->pDevObj, STATUS_UNSUCCESSFUL, L"AddFdoPort ShowPort FAIL"); } else { HidePortName(pDevExt); } status = STATUS_SUCCESS; Trace0((PC0C_COMMON_EXTENSION)pDevExt, L"AddFdoPort OK"); clean: if (!NT_SUCCESS(status) && pDevExt) RemoveFdoPort(pDevExt); StrFree(&ntDeviceName); StrFree(&portName); return status; } VOID RemovePdoPort(IN PC0C_PDOPORT_EXTENSION pDevExt) { Trace0((PC0C_COMMON_EXTENSION)pDevExt, L"RemovePdoPort"); IoDeleteDevice(pDevExt->pDevObj); } NTSTATUS AddPdoPort( IN PDRIVER_OBJECT pDrvObj, IN ULONG num, IN BOOLEAN isA, IN PC0C_FDOBUS_EXTENSION pBusExt, IN PC0C_IO_PORT pIoPortLocal, OUT PC0C_PDOPORT_EXTENSION *ppDevExt) { NTSTATUS status; UNICODE_STRING portName; PDEVICE_OBJECT pNewDevObj; UNICODE_STRING ntDeviceName; PC0C_PDOPORT_EXTENSION pDevExt = NULL; status = STATUS_SUCCESS; RtlInitUnicodeString(&portName, NULL); StrAppendStr0(&status, &portName, isA ? C0C_PREF_PORT_NAME_A : C0C_PREF_PORT_NAME_B); StrAppendNum(&status, &portName, num, 10); RtlInitUnicodeString(&ntDeviceName, NULL); StrAppendStr0(&status, &ntDeviceName, isA ? C0C_PREF_DEVICE_NAME_A : C0C_PREF_DEVICE_NAME_B); StrAppendNum(&status, &ntDeviceName, num, 10); if (!NT_SUCCESS(status)) { SysLog(pBusExt->pDevObj, status, L"AddPdoPort FAIL"); goto clean; } status = IoCreateDevice(pDrvObj, sizeof(*pDevExt), &ntDeviceName, FILE_DEVICE_SERIAL_PORT, FILE_DEVICE_SECURE_OPEN, TRUE, &pNewDevObj); if (!NT_SUCCESS(status)) { SysLog(pBusExt->pDevObj, status, L"AddPdoPort IoCreateDevice FAIL"); goto clean; } HALT_UNLESS(pNewDevObj); pIoPortLocal->pPhDevObj = pNewDevObj; pDevExt = (pNewDevObj)->DeviceExtension; HALT_UNLESS(pDevExt); RtlZeroMemory(pDevExt, sizeof(*pDevExt)); status = InitCommonExt((PC0C_COMMON_EXTENSION)pDevExt, pNewDevObj, C0C_DOTYPE_PP, portName.Buffer); if (!NT_SUCCESS(status)) { SysLog(pBusExt->pDevObj, status, L"AddPdoPort FAIL"); goto clean; } pDevExt->pBusExt = pBusExt; pDevExt->pIoPortLocal = pIoPortLocal; Trace00((PC0C_COMMON_EXTENSION)pDevExt, L"AddPdoPort OK - ", ntDeviceName.Buffer); clean: if (!NT_SUCCESS(status) && pDevExt) { RemovePdoPort(pDevExt); pDevExt = NULL; } StrFree(&ntDeviceName); StrFree(&portName); *ppDevExt = pDevExt; return status; } VOID RemoveFdoBus(IN PC0C_FDOBUS_EXTENSION pDevExt) { int i; for (i = 0 ; i < 2 ; i++) { if (pDevExt->childs[i].pDevExt) RemovePdoPort(pDevExt->childs[i].pDevExt); } if (pDevExt->pLowDevObj) IoDetachDevice(pDevExt->pLowDevObj); Trace0((PC0C_COMMON_EXTENSION)pDevExt, L"RemoveFdoBus"); IoDeleteDevice(pDevExt->pDevObj); } ULONG AllocPortNum(IN PDRIVER_OBJECT pDrvObj, ULONG num) { PDEVICE_OBJECT pDevObj; ULONG numNext; PCHAR pBusyMask; SIZE_T busyMaskLen; ULONG maskNum; ULONG mask; numNext = 0; for (pDevObj = pDrvObj->DeviceObject ; pDevObj ; pDevObj = pDevObj->NextDevice) { PC0C_FDOBUS_EXTENSION pDevExt = (PC0C_FDOBUS_EXTENSION)pDevObj->DeviceExtension; if (pDevExt && pDevExt->doType == C0C_DOTYPE_FB) { ULONG portNum = pDevExt->portNum; if (portNum >= numNext) numNext = portNum + 1; } } if (num == (ULONG)-1) num = 0; if (num >= numNext) return num; busyMaskLen = (numNext + (sizeof(*pBusyMask)*8 - 1))/(sizeof(*pBusyMask)*8); pBusyMask = C0C_ALLOCATE_POOL(PagedPool, busyMaskLen); if (!pBusyMask) { SysLog(pDrvObj, STATUS_INSUFFICIENT_RESOURCES, L"AllocPortNum C0C_ALLOCATE_POOL FAIL"); return numNext; } RtlZeroMemory(pBusyMask, busyMaskLen); for (pDevObj = pDrvObj->DeviceObject ; pDevObj ; pDevObj = pDevObj->NextDevice) { PC0C_FDOBUS_EXTENSION pDevExt = (PC0C_FDOBUS_EXTENSION)pDevObj->DeviceExtension; if (pDevExt && pDevExt->doType == C0C_DOTYPE_FB) { ULONG portNum = pDevExt->portNum; maskNum = portNum/(sizeof(*pBusyMask)*8); mask = 1 << (portNum%(sizeof(*pBusyMask)*8)); HALT_UNLESS3(maskNum < busyMaskLen, portNum, busyMaskLen, numNext); pBusyMask[maskNum] |= mask; } } maskNum = num/(sizeof(*pBusyMask)*8); mask = 1 << (num%(sizeof(*pBusyMask)*8)); if ((pBusyMask[maskNum] & mask) != 0) { for (num = 0 ; num < numNext ; num++) { maskNum = num/(sizeof(*pBusyMask)*8); mask = 1 << (num%(sizeof(*pBusyMask)*8)); HALT_UNLESS3(maskNum < busyMaskLen, num, busyMaskLen, numNext); if ((pBusyMask[maskNum] & mask) == 0) break; } } C0C_FREE_POOL(pBusyMask); return num; } ULONG GetPortNum(IN PDRIVER_OBJECT pDrvObj, IN PDEVICE_OBJECT pPhDevObj) { ULONG num; ULONG numPref; HANDLE hKey; NTSTATUS status; numPref = (ULONG)-1; status = IoOpenDeviceRegistryKey(pPhDevObj, PLUGPLAY_REGKEY_DEVICE, STANDARD_RIGHTS_READ, &hKey); if (status == STATUS_SUCCESS) { UNICODE_STRING keyName; PKEY_VALUE_PARTIAL_INFORMATION pInfo; ULONG len; RtlInitUnicodeString(&keyName, C0C_REGSTR_VAL_PORT_NUM); len = sizeof(KEY_VALUE_FULL_INFORMATION) + sizeof(ULONG); pInfo = C0C_ALLOCATE_POOL(PagedPool, len); if (pInfo) { status = ZwQueryValueKey(hKey, &keyName, KeyValuePartialInformation, pInfo, len, &len); if (NT_SUCCESS(status) && pInfo->DataLength == sizeof(ULONG)) numPref = *(PULONG)pInfo->Data; C0C_FREE_POOL(pInfo); } if (numPref == (ULONG)-1) num = AllocPortNum(pDrvObj, numPref); else num = numPref; if (num != numPref) { status = ZwSetValueKey(hKey, &keyName, 0, REG_DWORD, &num, sizeof(num)); if (!NT_SUCCESS(status)) SysLog(pPhDevObj, status, L"ZwSetValueKey(PortName) FAIL"); } ZwClose(hKey); } else { SysLog(pPhDevObj, status, L"GetPortNum IoOpenDeviceRegistryKey(PLUGPLAY_REGKEY_DEVICE) FAIL"); num = AllocPortNum(pDrvObj, numPref); } return num; } NTSTATUS AddFdoBus(IN PDRIVER_OBJECT pDrvObj, IN PDEVICE_OBJECT pPhDevObj) { NTSTATUS status = STATUS_SUCCESS; UNICODE_STRING portName; UNICODE_STRING ntDeviceName; PDEVICE_OBJECT pNewDevObj; PC0C_FDOBUS_EXTENSION pDevExt = NULL; ULONG num; int i; num = GetPortNum(pDrvObj, pPhDevObj); RtlInitUnicodeString(&portName, NULL); StrAppendStr0(&status, &portName, C0C_PREF_BUS_NAME); StrAppendNum(&status, &portName, num, 10); RtlInitUnicodeString(&ntDeviceName, NULL); StrAppendStr0(&status, &ntDeviceName, C0C_PREF_NT_DEVICE_NAME); StrAppendStr(&status, &ntDeviceName, portName.Buffer, portName.Length); if (!NT_SUCCESS(status)) { SysLog(pDrvObj, status, L"AddFdoBus FAIL"); goto clean; } status = IoCreateDevice(pDrvObj, sizeof(*pDevExt), &ntDeviceName, FILE_DEVICE_BUS_EXTENDER, 0, TRUE, &pNewDevObj); if (!NT_SUCCESS(status)) { SysLog(pDrvObj, status, L"AddFdoBus IoCreateDevice FAIL"); goto clean; } HALT_UNLESS(pNewDevObj); pDevExt = pNewDevObj->DeviceExtension; HALT_UNLESS(pDevExt); RtlZeroMemory(pDevExt, sizeof(*pDevExt)); status = InitCommonExt((PC0C_COMMON_EXTENSION)pDevExt, pNewDevObj, C0C_DOTYPE_FB, portName.Buffer); if (!NT_SUCCESS(status)) { SysLog(pDrvObj, status, L"AddFdoBus InitCommonExt FAIL"); goto clean; } pDevExt->portNum = num; pDevExt->pLowDevObj = IoAttachDeviceToDeviceStack(pNewDevObj, pPhDevObj); if (!pDevExt->pLowDevObj) { status = STATUS_NO_SUCH_DEVICE; SysLog(pNewDevObj, status, L"AddFdoBus IoAttachDeviceToDeviceStack FAIL"); goto clean; } pNewDevObj->Flags &= ~DO_DEVICE_INITIALIZING; KeInitializeSpinLock(&pDevExt->ioLock); for (i = 0 ; i < 2 ; i++) { PC0C_IO_PORT pIoPort; int j; pIoPort = &pDevExt->childs[i].ioPort; pIoPort->pIoLock = &pDevExt->ioLock; for (j = 0 ; j < C0C_QUEUE_SIZE ; j++) { InitializeListHead(&pIoPort->irpQueues[j].queue); pIoPort->irpQueues[j].pCurrent = NULL; #if DBG pIoPort->irpQueues[j].started = FALSE; #endif /* DBG */ } pIoPort->pIoPortRemote = &pDevExt->childs[(i + 1) % 2].ioPort; status = AddPdoPort(pDrvObj, num, (BOOLEAN)(i ? FALSE : TRUE), pDevExt, pIoPort, &pDevExt->childs[i].pDevExt); if (!NT_SUCCESS(status)) { SysLog(pNewDevObj, status, L"AddFdoBus AddPdoPort FAIL"); pDevExt->childs[i].pDevExt = NULL; goto clean; } } Trace0((PC0C_COMMON_EXTENSION)pDevExt, L"AddFdoBus OK"); clean: if (!NT_SUCCESS(status) && pDevExt) RemoveFdoBus(pDevExt); StrFree(&ntDeviceName); StrFree(&portName); return status; } NTSTATUS c0cAddDevice(IN PDRIVER_OBJECT pDrvObj, IN PDEVICE_OBJECT pPhDevObj) { NTSTATUS status; UNICODE_STRING property; status = STATUS_SUCCESS; RtlInitUnicodeString(&property, NULL); StrAppendDeviceProperty(&status, &property, pPhDevObj, DevicePropertyHardwareID); if (NT_SUCCESS(status)) Trace00(NULL, L"c0cAddDevice for ", property.Buffer); else { SysLog(pDrvObj, status, L"c0cAddDevice IoGetDeviceProperty FAIL"); return status; } if (!_wcsicmp(C0C_PORT_DEVICE_ID, property.Buffer)) { StrFree(&property); status = AddFdoPort(pDrvObj, pPhDevObj); } else if (!_wcsicmp(C0C_BUS_DEVICE_ID, property.Buffer)) { StrFree(&property); status = AddFdoBus(pDrvObj, pPhDevObj); } else { StrFree(&property); status = STATUS_UNSUCCESSFUL; SysLog(pDrvObj, status, L"c0cAddDevice unknown HardwareID"); } return status; } Тут есть люди, которые делали драйвер виртуального КОМ порта? Если кто-то в курсе, то у меня есть несколько вопросов по этому коду...
Кто знает или где можно почитать такую вещь: Как именно образуется пара, как один порт понимает кто его пара??? И почему при создании пары создаётся аж 5 устройств?
Обращаюсь за помощью, совсем отчаился( Прочитал довольно много литературы о программировании драйверов, но как дошло до практики, остановился на первой ступеньке. Никак не получается собрать готовый .sys файл. Последний день полность потратил на поиск решений в интернете. Нашел очень много всего, вот пара ссылок: http://habrahabr.ru/blogs/system_programming/40466/ http://storinka.com.ua/komplirovanie...l-studio-2008/ и были многие другие... но ни одним способом откомпилить драйвер не получилось. Все время или появляются странные ошибки.. а если странных ошибок нет, то ошибки в самих DDK библиотеках. Вот пример : код взят отсюда http://habrahabr.ru/blogs/system_programming/40466/ C:\WINDDK\2600>cd C:\new C:\new>build BUILD: Object root set to: ==> objchk BUILD: Adding /Y to COPYCMD so xcopy ops won't hang. BUILD: /i switch ignored BUILD: Using 2 child processes BUILD: Compile and Link for i386 BUILD: Loading C:\WINDDK\2600\build.dat... BUILD: Computing Include file dependencies: BUILD: Examining c:\new directory for files to compile. c:\new - 1 source files (20 lines) BUILD: Compiling c:\new directory 1>Compiling - testdriver.c for i386 1>testdriver.c(13) : error C2018: unknown character '0xab'; unicode identifiers are not supported 1>testdriver.c(13) : error C2065: 'Hello' : undeclared identifier 1>testdriver.c(13) : error C4047: 'function' : 'PCH' differs in levels of indire ction from 'int' 1>testdriver.c(13) : error C2146: syntax error : missing ')' before identifier ' world' 1>testdriver.c(13) : error C2144: syntax error : '<Unknown>' should be preceded by '<Unknown>' 1>testdriver.c(13) : error C2144: syntax error : '<Unknown>' should be preceded by '<Unknown>' 1>testdriver.c(13) : error C2143: syntax error : missing ')' before 'identifier' 1>testdriver.c(13) : error C2017: illegal escape sequence 1>testdriver.c(13) : error C2018: unknown character '0xbb'; unicode identifiers are not supported 1>testdriver.c(13) : error C2059: syntax error : ')' 1>testdriver.c(20) : error C2018: unknown character '0xab'; unicode identifiers are not supported 1>testdriver.c(20) : error C2065: 'Goodbye' : undeclared identifier 1>testdriver.c(20) : error C4047: 'function' : 'PCH' differs in levels of indire ction from 'int' 1>testdriver.c(20) : error C2143: syntax error : missing ')' before '!' 1>testdriver.c(20) : error C2017: illegal escape sequence 1>testdriver.c(20) : error C2018: unknown character '0xbb'; unicode identifiers are not supported 1>testdriver.c(20) : error C2059: syntax error : ')' BUILD: Compile errors: not linking c:\new directory BUILD: Done 2 files compiled - 17 Errors Я качал различные версии DDK с разных сайтов.. итог один и тот же. Я кто-то сталкивался с подобным - помогите пожалуйста. (( Я до этого тока учебные драйверы на асме компилил, и там никаких проблем не было.