[C] помогите исправить ошибку

marizha

взял код здесь
http://www.codeproject.com/KB/IP/drvfltip.aspx
это простенький фильтр ip пакетов с помощью ip hook driver
поставил WDK(ver.6000) и VS2005 на Vista (хотя в доках написано, что эта фича не поддерживается на Vista, юзайте типа callout, но и на winXP с тем же WDK тоже самое... может ли быть такое, что этот WDK не поддерживает предыдущие разработки и мне нужен какой-нить старый DDK?)...
в результате получил ошибку

1>DrvFltIp.obj : error LNK2019: unresolved external symbol _IofCompl8 referenced in function _D8
1>DrvFltIp.obj : error LNK2019: unresolved external symbol _ObfDerefer4 referenced in function _SetFilt4
1>DrvFltIp.obj : error LNK2019: unresolved external symbol _Iof8 referenced in function _SetFilt4
1>Debug\DrvFltIp.sys : fatal error LNK1120: 3 unresolved externals

что означают
_ObfDerefer4?

понятно что переменная ObfDereferenceObject, наверное 4-я в стеке, но чего-то я не могу такой найти явно в коде и в определениях типов
если кто заинтересуется и разрешит проблему, я был бы рад услышать как...
вот код SetFilterFunction (DrvDispatch побольше, поэтому не привел ее)

NTSTATUS SetFilterFunction(PacketFilterExtensionPtr filterFunction)
{
NTSTATUS status = STATUS_SUCCESS, waitStatus=STATUS_SUCCESS;
UNICODE_STRING filterName;
PDEVICE_OBJECT ipDeviceObject=NULL;
PFILE_OBJECT ipFileObject=NULL;

PF_SET_EXTENSION_HOOK_INFO filterData;

KEVENT event;
IO_STATUS_BLOCK ioStatus;
PIRP irp;

dprintf("Getting pointer to IpFilterDriver\n");

//first of all, we have to get a pointer to IpFilterDriver Device
RtlInitUnicodeString(&filterName, DD_IPFLTRDRVR_DEVICE_NAME);
status = IoGetDeviceObjectPointer(&filterName,STANDARD_RIGHTS_ALL, &ipFileObject, &ipDeviceObject);

if(NT_SUCCESS(status
{
//initialize the struct with functions parameters
filterData.ExtensionPointer = filterFunction;

//we need initialize the event used later by the IpFilterDriver to signal us
//when it finished its work
KeInitializeEvent(&event, NotificationEvent, FALSE);

//we build the irp needed to establish fitler function
irp = IoBuildDeviceIoControlRequest(IOCTL_PF_SET_EXTENSION_POINTER,
ipDeviceObject,
(PVOID) &filterData,
sizeof(PF_SET_EXTENSION_HOOK_INFO
NULL,
0,
FALSE,
&event,
&ioStatus);


if(irp != NULL)
{
// we send the IRP
status = IoCallDriver(ipDeviceObject, irp);

//and finally, we wait for "acknowledge" of IpDriverFilter
if (status == STATUS_PENDING)
{
waitStatus = KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, NULL);

if (waitStatus != STATUS_SUCCESS )
dprintf("Error waiting for IpFilterDriver response.");
}

status = ioStatus.Status;

if(!NT_SUCCESS(status
dprintf("Error, IO error with ipFilterDriver\n");
}

else
{
//if we cant allocate the space, we return the corresponding code error
status = STATUS_INSUFFICIENT_RESOURCES;

dprintf("Error building IpFilterDriver IRP\n");
}

if(ipFileObject != NULL)
ObDereferenceObject(ipFileObject);

ipFileObject = NULL;
ipDeviceObject = NULL;
}

else
dprintf("Error while getting the pointer\n");

return status;
}

Papazyan

PDEVICE_OBJECT
Посмотри что это.

Trofimovyoa

unresolved external symbol
Линкер не может найти эту функцию, по идее она должна быть в ntoskrnl.lib. В опциях к линкеру указано использовать эту библиотеку? Если указано, то тогда, скорее всего, причиной проблем может стать предполагавшаяся тобой несовместимость версий ДДК. В ДДК НТ4.0 такая функция есть, и с таким точно названием.

Ага, вот подобная проблема, а у тебя наверно перед ошибками еще и warningи были?!) Добейся сначала их устранения.

marizha

этот пост я тоже нашел и у меня схожие warnings, но решения там не предлагается
ntoskrnl.lib присутствует в Commnad Line линкера
у меня есть winxp_ddk, но он врят ли встанет на vista, а если и встанет, то врят ли адекватно, так что попробую позже на winXP

Trofimovyoa

решения там не предлагается
Решение - найти и дать компилятору и линкеру подходящие .h и .lib файлы.
Насчет установки DDK - тебе нужно просто содержимое папок inc и lib из DDK (соответствующее твоей платформе) и прописать в студии пути к нему.

evgen5555

Из консоли собираешь или из студии?

SPARTAK3959

понятно что переменная ObfDereferenceObject, наверное 4-я в стеке,
На будущее - это обычно означает, что функция ObfDereferenceObject использует конвенцию вызова stdcall и суммарный размер ее параметров - 4 байта.

Andbar

понятно что переменная ObfDereferenceObject, наверное 4-я в стеке
ты бы попробовал сперва ознакомиться со студией и её компилятором на обычных проектах, а потом бы уже за драйверы брался... а то складывается впечатление, что ты даже не разобрался, как открыть справку по ошибке.
Оставить комментарий
Имя или ник:
Комментарий: