ykoshi
驱动牛犊
驱动牛犊
  • 注册日期2010-03-03
  • 最后登录2011-05-03
  • 粉丝0
  • 关注0
  • 积分17分
  • 威望151点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:3010回复:3

刚学驱动不知这个问题怎么改

楼主#
更多 发布于:2010-03-03 11:01
d:\hellowdm.obj() : error LNK2019: unresolved external symbol "unsigned long __cdecl DbgPrint(char *,...)" (?DbgPrint@@YAKPADZZ) referenced in function _DriverEntry@8
d:\hellowdm.obj() : error LNK2019: unresolved external symbol "__declspec(dllimport) long __stdcall IoDeleteSymbolicLink(struct _UNICODE_STRING *)" (__imp_?IoDeleteSymbolicLink@@YGJPAU_UNICODE_STRING@@@Z) referenced in function "long __stdcall HelloWDMAddDevice(struct _DRIVER_OBJECT *,struct _DEVICE_OBJECT *)" (?HelloWDMAddDevice@@YGJPAU_DRIVER_OBJECT@@PAU_DEVICE_OBJECT@@@Z)
d:\hellowdm.obj() : error LNK2019: unresolved external symbol "__declspec(dllimport) long __stdcall IoCreateSymbolicLink(struct _UNICODE_STRING *,struct _UNICODE_STRING *)" (__imp_?IoCreateSymbolicLink@@YGJPAU_UNICODE_STRING@@0@Z) referenced in function "long __stdcall HelloWDMAddDevice(struct _DRIVER_OBJECT *,struct _DEVICE_OBJECT *)" (?HelloWDMAddDevice@@YGJPAU_DRIVER_OBJECT@@PAU_DEVICE_OBJECT@@@Z)
d:\hellowdm.obj() : error LNK2019: unresolved external symbol "__declspec(dllimport) struct _DEVICE_OBJECT * __stdcall IoAttachDeviceToDeviceStack(struct _DEVICE_OBJECT *,struct _DEVICE_OBJECT *)" (__imp_?IoAttachDeviceToDeviceStack@@YGPAU_DEVICE_OBJECT@@PAU1@0@Z) referenced in function "long __stdcall HelloWDMAddDevice(struct _DRIVER_OBJECT *,struct _DEVICE_OBJECT *)" (?HelloWDMAddDevice@@YGJPAU_DRIVER_OBJECT@@PAU_DEVICE_OBJECT@@@Z)
d:\hellowdm.obj() : error LNK2019: unresolved external symbol "__declspec(dllimport) long __stdcall IoCreateDevice(struct _DRIVER_OBJECT *,unsigned long,struct _UNICODE_STRING *,unsigned long,unsigned long,unsigned char,struct _DEVICE_OBJECT * *)" (__imp_?IoCreateDevice@@YGJPAU_DRIVER_OBJECT@@KPAU_UNICODE_STRING@@KKEPAPAU_DEVICE_OBJECT@@@Z) referenced in function "long __stdcall HelloWDMAddDevice(struct _DRIVER_OBJECT *,struct _DEVICE_OBJECT *)" (?HelloWDMAddDevice@@YGJPAU_DRIVER_OBJECT@@PAU_DEVICE_OBJECT@@@Z)
d:\hellowdm.obj() : error LNK2019: unresolved external symbol "__declspec(dllimport) void __stdcall RtlInitUnicodeString(struct _UNICODE_STRING *,unsigned short const *)" (__imp_?RtlInitUnicodeString@@YGXPAU_UNICODE_STRING@@PBG@Z) referenced in function "long __stdcall HelloWDMAddDevice(struct _DRIVER_OBJECT *,struct _DEVICE_OBJECT *)" (?HelloWDMAddDevice@@YGJPAU_DRIVER_OBJECT@@PAU_DEVICE_OBJECT@@@Z)
d:\hellowdm.obj() : error LNK2019: unresolved external symbol "__declspec(dllimport) void __stdcall RtlAssert(void *,void *,unsigned long,char *)" (__imp_?RtlAssert@@YGXPAX0KPAD@Z) referenced in function "long __stdcall HelloWDMAddDevice(struct _DRIVER_OBJECT *,struct _DEVICE_OBJECT *)" (?HelloWDMAddDevice@@YGJPAU_DRIVER_OBJECT@@PAU_DEVICE_OBJECT@@@Z)
d:\hellowdm.obj() : error LNK2019: unresolved external symbol "__declspec(dllimport) unsigned char __stdcall KeGetCurrentIrql(void)" (__imp_?KeGetCurrentIrql@@YGEXZ) referenced in function "long __stdcall HelloWDMAddDevice(struct _DRIVER_OBJECT *,struct _DEVICE_OBJECT *)" (?HelloWDMAddDevice@@YGJPAU_DRIVER_OBJECT@@PAU_DEVICE_OBJECT@@@Z)
d:\hellowdm.obj() : error LNK2019: unresolved external symbol "__declspec(dllimport) long __fastcall IofCallDriver(struct _DEVICE_OBJECT *,struct _IRP *)" (__imp_?IofCallDriver@@YIJPAU_DEVICE_OBJECT@@PAU_IRP@@@Z) referenced in function "long __stdcall DefaultPnpHandler(struct _DEVICE_EXTENSION *,struct _IRP *)" (?DefaultPnpHandler@@YGJPAU_DEVICE_EXTENSION@@PAU_IRP@@@Z)
d:\hellowdm.obj() : error LNK2019: unresolved external symbol "__declspec(dllimport) void __stdcall IoDeleteDevice(struct _DEVICE_OBJECT *)" (__imp_?IoDeleteDevice@@YGXPAU_DEVICE_OBJECT@@@Z) referenced in function "long __stdcall HandleRemoveDevice(struct _DEVICE_EXTENSION *,struct _IRP *)" (?HandleRemoveDevice@@YGJPAU_DEVICE_EXTENSION@@PAU_IRP@@@Z)
d:\hellowdm.obj() : error LNK2019: unresolved external symbol "__declspec(dllimport) void __stdcall IoDetachDevice(struct _DEVICE_OBJECT *)" (__imp_?IoDetachDevice@@YGXPAU_DEVICE_OBJECT@@@Z) referenced in function "long __stdcall HandleRemoveDevice(struct _DEVICE_EXTENSION *,struct _IRP *)" (?HandleRemoveDevice@@YGJPAU_DEVICE_EXTENSION@@PAU_IRP@@@Z)
d:\hellowdm.obj() : error LNK2019: unresolved external symbol "__declspec(dllimport) void __fastcall IofCompleteRequest(struct _IRP *,char)" (__imp_?IofCompleteRequest@@YIXPAU_IRP@@D@Z) referenced in function "long __stdcall HelloWDMDispatchRoutine(struct _DEVICE_OBJECT *,struct _IRP *)" (?HelloWDMDispatchRoutine@@YGJPAU_DEVICE_OBJECT@@PAU_IRP@@@Z)
d:\objchk\i386\hellowdm.sys() : error LNK1120: 12 unresolved externals



另附源码
头文件:
#ifdef _cplusplus
extern "C"
{
#endif
#include <wdm.h>
#ifdef _cplusplus
}
#endif


typedef struct _DEVICE_EXTENSION{
    PDEVICE_OBJECT fdo;
    PDEVICE_OBJECT NextStackDevice;
    UNICODE_STRING ustrDeviceName;
    UNICODE_STRING ustrSymLinkName;
}DEVICE_EXTENSION,*PDEVICE_EXTENSION;

#define   PAGEDCODE code_seg("PAGE")
#define   LOCKEDCODE code_seg()
#define   INITCODE code_seg("INIT")

#define   PAGEDDATA data_seg("PAGE")
#define   LOCKEDDATA data_seg()
#define   INITDATA data_seg("INIT")

#define arraysize(p) (sizeof(p)/sizeof((p)[0]))

NTSTATUS HelloWDMAddDevice(IN PDRIVER_OBJECT DriverObject,
                           IN PDEVICE_OBJECT PhysicalDeviceObject);
NTSTATUS HelloWDMPnp(IN PDEVICE_OBJECT fdo,
                     IN PIRP Irp);
NTSTATUS HelloWDMDispatchRoutine(IN PDEVICE_OBJECT fdo,
                                 IN PIRP Irp);
void HelloWDMUnload(IN PDRIVER_OBJECT DriverObject);

extern "C"
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,
                     IN PUNICODE_STRING RegistryPath);


源文件:
#include "HelloWDM.h"

#pragma INITCODE
extern "C" NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject,
                                IN PUNICODE_STRING pRegistryPath)
{
    KdPrint(("Enter DriverEntry\n"));


    pDriverObject->DriverExtension->AddDevice=HelloWDMAddDevice;
    pDriverObject->MajorFunction[IRP_MJ_PNP]=HelloWDMPnp;
    pDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] =
    pDriverObject->MajorFunction[IRP_MJ_CREATE] =
    pDriverObject->MajorFunction[IRP_MJ_READ] =
    pDriverObject->MajorFunction[IRP_MJ_WRITE] = HelloWDMDispatchRoutine;
    pDriverObject->DriverUnload=HelloWDMUnload;

    KdPrint(("Leave DriverEntry\n"));
    return STATUS_SUCCESS;
}

#pragma PAGEDCODE
NTSTATUS HelloWDMAddDevice(IN PDRIVER_OBJECT DriverObject,
                           IN PDEVICE_OBJECT PhysicalDeviceObject)
{
    PAGED_CODE();
    
    KdPrint(("Enter HelloWDMAddDevice\n"));

    NTSTATUS status;
    PDEVICE_OBJECT fdo;
    UNICODE_STRING devName;
    RtlInitUnicodeString(&devName,L"\\Device\\MyWDMDevice");
    status=IoCreateDevice(DriverObject,
                          sizeof(DEVICE_EXTENSION),
                          &(UNICODE_STRING)devName,
                          FILE_DEVICE_UNKNOWN,
                          0,
                          FALSE,
                          &fdo);
    if(!NT_SUCCESS(status))return status;
    PDEVICE_EXTENSION pdx=(PDEVICE_EXTENSION)fdo->DeviceExtension;
    pdx->fdo=fdo;
    pdx->NextStackDevice=IoAttachDeviceToDeviceStack(fdo,PhysicalDeviceObject);
    UNICODE_STRING SymLinkName;
    RtlInitUnicodeString(&SymLinkName,L"\\DosDevices\\HelloWDM");

    pdx->ustrDeviceName=devName;
    pdx->ustrSymLinkName=SymLinkName;
    status=IoCreateSymbolicLink(&(UNICODE_STRING)SymLinkName,
                                &(UNICODE_STRING)devName);
    if(!NT_SUCCESS(status))
    {
        IoDeleteSymbolicLink(&pdx->ustrSymLinkName);
        status=IoCreateSymbolicLink(&SymLinkName,
                                    &devName);
        if(!NT_SUCCESS(status))
        {
            return status;
        }
    }
    fdo->Flags|=DO_BUFFERED_IO|DO_POWER_PAGABLE;
    fdo->Flags&=~DO_DEVICE_INITIALIZING;
    KdPrint(("Leave HelloWDMAddDevice\n"));
    return STATUS_SUCCESS;
}

#pragma PAGEDCODE
NTSTATUS DefaultPnpHandler(PDEVICE_EXTENSION pdx,PIRP Irp)
{
    PAGED_CODE();
    
    KdPrint(("Enter DefaultPnpHandler\n"));
    IoSkipCurrentIrpStackLocation(Irp);
    KdPrint(("Leave DefaultPnpHandler\n"));
    return IoCallDriver(pdx->NextStackDevice,Irp);
}


#pragma PAGEDCODE
NTSTATUS HandleRemoveDevice(PDEVICE_EXTENSION pdx,PIRP Irp)
{
    PAGED_CODE();
    
    KdPrint(("Enter HandleRemoveDevice\n"));
    
    Irp->IoStatus.Status=STATUS_SUCCESS;
    NTSTATUS status=DefaultPnpHandler(pdx,Irp);
    IoDeleteSymbolicLink(&(UNICODE_STRING)pdx->ustrSymLinkName);
    
    if(pdx->NextStackDevice)
        IoDetachDevice(pdx->NextStackDevice);
    
    IoDeleteDevice(pdx->fdo);
    KdPrint(("Leave HandleRemoveDevice\n"));
    return status;
}

#pragma PAGEDCODE
NTSTATUS HelloWDMPnp(IN PDEVICE_OBJECT fdo,
                     IN PIRP Irp)
{
    PAGED_CODE();
    
    KdPrint(("Enter HelloWDMPnp\n"));
    NTSTATUS status=STATUS_SUCCESS;
    PDEVICE_EXTENSION pdx=(PDEVICE_EXTENSION)fdo->DeviceExtension;
    PIO_STACK_LOCATION stack=IoGetCurrentIrpStackLocation(Irp);
    static NTSTATUS (*fcntab[])(PDEVICE_EXTENSION pdx,PIRP Irp)=
    {
        DefaultPnpHandler,
        DefaultPnpHandler,
        HandleRemoveDevice,
        DefaultPnpHandler,
        DefaultPnpHandler,
        DefaultPnpHandler,
        DefaultPnpHandler,
        DefaultPnpHandler,
        DefaultPnpHandler,
        DefaultPnpHandler,
        DefaultPnpHandler,
        DefaultPnpHandler,
        DefaultPnpHandler,
        DefaultPnpHandler,
        DefaultPnpHandler,
        DefaultPnpHandler,
        DefaultPnpHandler,
        DefaultPnpHandler,
        DefaultPnpHandler,
        DefaultPnpHandler,
        DefaultPnpHandler,
        DefaultPnpHandler,
        DefaultPnpHandler,
        DefaultPnpHandler,
    };
    ULONG fcn=stack->MinorFunction;
    if(fcn>=arraysize(fcntab))
    {
        status=DefaultPnpHandler(pdx,Irp);
        return status;
    }

#if DBG
    static char *fcnname[]=
    {
        "IRP_MN_START_DEVICE",
        "IRP_MN_QUERY_REMOVE_DEVICE",
        "IRP_MN_REMOVE_DEVICE",
        "IRP_MN_CANCEL_REMOVE_DEVICE",
        "IRP_MN_STOP_DEVICE",
        "IRP_MN_QUERY_STOP_DEVICE",
        "IRP_MN_CANCEL_STOP_DEVICE",
        "IRP_MN_QUERY_DEVICE_RELATIONS",
        "IRP_MN_QUERY_INTERFACE",
        "IRP_MN_QUERY_CAPABILITIES",
        "IRP_MN_QUERY_RESOURCES",
        "IRP_MN_QUERY_RESOURCE_REQUIREMENTS",
        "IRP_MN_QUERY_DEVICE_TEXT",
        "IRP_MN_FILTER_RESOURCE_REQUIREMENTS",
        "",
        "IRP_MN_READ_CONFIG",
        "IRP_MN_WRITE_CONFIG",
        "IRP_MN_EJECT",
        "IRP_MN_SET_LOCK",
        "IRP_MN_QUERY_ID",
        "IRP_MN_QUERY_PNP_DEVICE_STATE",
        "IRP_MN_QUERY_BUS_INFORMATION",
        "IRP_MN_DEVICE_USAGE_NOTIFICATION",
        "IRP_MN_SURPRISE_REMOVAL",
    };
    KdPrint(("PNP Request  (%s)\n",fcnname[fcn]));
#endif
    status=(*fcntab[fcn])(pdx,Irp);
    KdPrint(("Leave HelloWDMPnp\n"));
    return status;
}


#pragma PAGEDCODE
NTSTATUS HelloWDMDispatchRoutine(IN PDEVICE_OBJECT fdo,
                                 IN PIRP Irp)
{
    PAGED_CODE();
    KdPrint(("Enter HelloWDMDispatchRoutine\n"));
    Irp->IoStatus.Status=STATUS_SUCCESS;
    Irp->IoStatus.Information=0;
    IoCompleteRequest(Irp,IO_NO_INCREMENT);
    KdPrint(("Leave HelloWDMDispatchRoutine\n"));
    return STATUS_SUCCESS;
}

#pragma PAGEDCODE
void HelloWDMUnload(IN PDRIVER_OBJECT DriverObject)
{
    PAGED_CODE();
    KdPrint(("Enter HelloWDMUnload\n"));
    KdPrint(("Leave HelloWDMUnload\n"));
}



sources文件:
TARGETNAME=HelloWDM
TARGETTYPE=DRIVER
DRIVERTYPE=WDM
TARGETPATH=OBJ

INCLUDES=$(BASEDIR)\inc;\
         $(BASEDIR)\inc\ddk;\

SOURCES=HelloWDM.cpp\


望大牛看看
znsoft
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2023-10-25
  • 粉丝300
  • 关注6
  • 积分910分
  • 威望14796点
  • 贡献值7点
  • 好评度2410点
  • 原创分5分
  • 专家分100分
  • 社区居民
  • 最爱沙发
  • 社区明星
沙发#
发布于:2010-03-03 13:13
这个问题,明显是基础不扎实,代码没错,但是sources文件有错,没有指明要连接的库,当然link不了了
http://www.zndev.com 免费源码交换网 ----------------------------- 软件创造价值,驱动提供力量! 淡泊以明志,宁静以致远。 ---------------------------------- 勤用搜索,多查资料,先搜再问。
ykoshi
驱动牛犊
驱动牛犊
  • 注册日期2010-03-03
  • 最后登录2011-05-03
  • 粉丝0
  • 关注0
  • 积分17分
  • 威望151点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2010-03-03 13:30
已解决 sources没错
将头文件中的
#ifdef _cplusplus
extern "C"
{
#endif
#include <wdm.h>
#ifdef _cplusplus
}
#endif
改为
#ifdef __cplusplus 这里是两个下划线
extern "C"
{
#endif
#include <wdm.h>
#ifdef __cplusplus 这里是下划线
}
#endif
即可
ykoshi
驱动牛犊
驱动牛犊
  • 注册日期2010-03-03
  • 最后登录2011-05-03
  • 粉丝0
  • 关注0
  • 积分17分
  • 威望151点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2010-03-03 13:32
不过还是谢谢znsoft
游客

返回顶部