Создание статичной lib в Visual Studio

Тема в разделе "WASM.BEGINNERS", создана пользователем Llirik, 29 янв 2011.

  1. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    что значит как? собрать obj компилятором, слинковать полученный obj вместе с другими obj'ами с помощью линкера...
     
  2. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    если вы имеете ввиду так:
    link /driver /base:0x10000 /align:32 /out:keymouse.sys /subsystem:native kbfiltr.obj keymouse.obj
    то выходит:
    keymouse.obj : error LNK2019: unresolved external symbol _KbFilter_PnP reference
    d in function _DriverEntry1@8
    keymouse.obj : error LNK2019: unresolved external symbol _KbFilter_AddDevice ref
    erenced in function _DriverEntry1@8
    keymouse.sys : fatal error LNK1120: 2 unresolved externalsа
    а если в kbfilter.c к именам функций добавить _, то при сборке выходит:
    1>kbfiltr.c(25) : error C2157: '_KbFilter_AddDevice' : must be declared before use in pragma list
    1>kbfiltr.c(31) : error C2157: '_KbFilter_PnP' : must be declared before use in pragma list
    1>kbfiltr.c(61) : error C2065: '_KbFilter_PnP' : undeclared identifier
    1>kbfiltr.c(61) : error C4047: '=' : 'PDRIVER_DISPATCH' differs in levels of indirection from 'int'
    1>kbfiltr.c(73) : error C2065: '_KbFilter_AddDevice' : undeclared identifier
    1>kbfiltr.c(73) : error C4047: '=' : 'PDRIVER_ADD_DEVICE' differs in levels of indirection from 'int'
    1>kbfiltr.c(83) : error C2365: '_KbFilter_AddDevice' : redefinition; previous definition was a 'data variable'
    1>kbfiltr.c(472) : error C2365: '_KbFilter_PnP' : redefinition; previous definition was a 'data variable'
     
  3. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    Llirik
    посмотрите какие символы есть в сишном обж-файле, точнее какие у них имена...
    Код (Text):
    1. objdump -t kbfiltr.obj
     
  4. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Microsoft Windows XP [Версия 5.1.2600]
    (С) Корпорация Майкрософт, 1985-2001.

    C:\masm32\WINDDK\bin\x86>objdump -t kbfiltr.obj
    OBJ OMF Dump Version 2.14 Freeware
    Copyright (c) 2007 Stepan Polovnikov

    Error read file
     
  5. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    а в IDA
    KbFilter_AddDevice(x,x) 000000FB P
    KbFilter_PnP(x,x) 0000064A P
     
  6. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    хм... странно...

    эмм... приведите код keymouse, как вы внешние функции там объявляете...
     
  7. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Код (Text):
    1. extrn KbFilter_PnP:near
    2. extrn  KbFilter_AddDevice:near
    3. ..............
    4. mov [eax].MajorFunction[IRP_MJ_PNP*(sizeof PVOID)], offset KbFilter_PnP
    5. ............
    6. mov [ecx].AddDevice, offset KbFilter_AddDevice
     
  8. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    хех... ну все вроде выглядит нормально... странно, что не линкуется... попробуйте посмотреть имена экстернов той же идой и сравнить их друг с другом... или залейте оба обжа сюда, я в понедельник попробую у себя их слинковать...
     
  9. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    я заменил
    extrn KbFilter_PnP:near
    extrn KbFilter_AddDevice:near
    на
    KbFilter_PnP PROTO :lol: WORD,:lol: WORD
    KbFilter_AddDevice PROTO :lol: WORD,:lol: WORD
    и всё слинковалось)
     
  10. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    хех... весело... интересно, в чем отличие в обж-файлах?
     
  11. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Не знаю) сейчас попробовал с другим обж-файлом, не получается(
     
  12. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    я попытался немножко код на С, то есть сделать его как в kbfiltr.c
    Код (Text):
    1. // Main program for filter driver
    2. // Copyright (C) 1999 by Walter Oney
    3. // All rights reserved
    4.  
    5. #include "stddcls.h"
    6. #include "driver.h"
    7.  
    8. #ifdef ALLOC_PRAGMA
    9. #pragma alloc_text (INIT, DriverEntry)
    10. #pragma alloc_text (PAGE, AddDevice)
    11. #pragma alloc_text (PAGE, DriverUnload)
    12. #pragma alloc_text (PAGE, DispatchAny)
    13. #pragma alloc_text (PAGE, DispatchPower)
    14. #pragma alloc_text (PAGE, DispatchPnp)
    15. #pragma alloc_text (PAGE, DispatchWmi)
    16. #pragma alloc_text (PAGE, GetDeviceTypeToUse)
    17. #pragma alloc_text (PAGE, StartDeviceCompletionRoutine)
    18. #pragma alloc_text (PAGE, UsageNotificationCompletionRoutine)
    19. #endif
    20.  
    21. NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,
    22.     IN PUNICODE_STRING RegistryPath)
    23.     {                           // DriverEntry
    24.     KdPrint((DRIVERNAME " - Entering DriverEntry: DriverObject %8.8lX\n", DriverObject));
    25.  
    26.     // Initialize function pointers
    27.  
    28.     DriverObject->DriverUnload = DriverUnload;
    29.     DriverObject->DriverExtension->AddDevice = AddDevice;
    30.  
    31.     for (int i = 0; i < arraysize(DriverObject->MajorFunction); ++i)
    32.         DriverObject->MajorFunction[i] = DispatchAny;
    33.  
    34.     DriverObject->MajorFunction[IRP_MJ_POWER] = DispatchPower;
    35.     DriverObject->MajorFunction[IRP_MJ_PNP] = DispatchPnp;
    36.    
    37.     return STATUS_SUCCESS;
    38.     }                           // DriverEntry
    39.  
    40.  
    41.  
    42. VOID DriverUnload(IN PDRIVER_OBJECT DriverObject)
    43.     {                           // DriverUnload
    44.     PAGED_CODE();
    45.     KdPrint((DRIVERNAME " - Entering DriverUnload: DriverObject %8.8lX\n", DriverObject));
    46.     }                           // DriverUnload
    47.  
    48. ///////////////////////////////////////////////////////////////////////////////
    49.  
    50. NTSTATUS AddDevice(IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT pdo)
    51.     {                           // AddDevice
    52.     PAGED_CODE();
    53.     KdPrint((DRIVERNAME " - Entering AddDevice: DriverObject %8.8lX, pdo %8.8lX\n", DriverObject, pdo));
    54.  
    55.     NTSTATUS status;
    56.  
    57.     // Create a device object. Do *not* specify any device characteristics here because
    58.     // some of them will get applied to all drivers in the stack, and it's not up to
    59.     // us as a filter to control any of the propagated attributes (e.g., FILE_DEVICE_SECURE_OPEN).
    60.     // The call to GetDeviceTypeToUse was added in SP-9 to overcome a bug in CDFS.
    61.  
    62.     PDEVICE_OBJECT fido;
    63.     status = IoCreateDevice(DriverObject, sizeof(DEVICE_EXTENSION), NULL,
    64.         GetDeviceTypeToUse(pdo), 0, FALSE, &fido);
    65.     if (!NT_SUCCESS(status))
    66.         {                       // can't create device object
    67.         KdPrint((DRIVERNAME " - IoCreateDevice failed - %X\n", status));
    68.         return status;
    69.         }                       // can't create device object
    70.    
    71.     PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fido->DeviceExtension;
    72.  
    73.     // From this point forward, any error will have side effects that need to
    74.     // be cleaned up.
    75.  
    76.     do
    77.         {                       // finish initialization
    78.         IoInitializeRemoveLock(&pdx->RemoveLock, 0, 0, 0);
    79.         pdx->DeviceObject = fido;
    80.         pdx->Pdo = pdo;
    81.  
    82.         // Add our device object to the stack and propagate critical settings
    83.         // from the immediately lower device object
    84.  
    85.         PDEVICE_OBJECT fdo = IoAttachDeviceToDeviceStack(fido, pdo);
    86.         if (!fdo)
    87.             {                   // can't attach                              
    88.             KdPrint((DRIVERNAME " - IoAttachDeviceToDeviceStack failed\n"));
    89.             status = STATUS_DEVICE_REMOVED;
    90.             break;;
    91.             }                   // can't attach
    92.  
    93.         pdx->LowerDeviceObject = fdo;
    94.  
    95.         // Copy the flags related to I/O buffering from the lower device object so the I/O manager
    96.         // will create the expected data structures for reads and writes.
    97.  
    98.         fido->Flags |= fdo->Flags & (DO_DIRECT_IO | DO_BUFFERED_IO | DO_POWER_PAGABLE);
    99.  
    100.         // Clear the "initializing" flag so that we can get IRPs
    101.  
    102.         fido->Flags &= ~DO_DEVICE_INITIALIZING;
    103.         }                       // finish initialization
    104.     while (FALSE);
    105.  
    106.     if (!NT_SUCCESS(status))
    107.         {                   // need to cleanup
    108.         if (pdx->LowerDeviceObject)
    109.             IoDetachDevice(pdx->LowerDeviceObject);
    110.         IoDeleteDevice(fido);
    111.         }                   // need to cleanup
    112.  
    113.     return status;
    114.     }                           // AddDevice
    115.  
    116.  
    117.  
    118. NTSTATUS CompleteRequest(IN PIRP Irp, IN NTSTATUS status, IN ULONG_PTR info)
    119.     {                           // CompleteRequest
    120.     Irp->IoStatus.Status = status;
    121.     Irp->IoStatus.Information = info;
    122.     IoCompleteRequest(Irp, IO_NO_INCREMENT);
    123.     return status;
    124.     }                           // CompleteRequest
    125.  
    126.  
    127. NTSTATUS DispatchAny(IN PDEVICE_OBJECT fido, IN PIRP Irp)
    128.     {                           // DispatchAny
    129.     PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fido->DeviceExtension;
    130.     PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(Irp);
    131.  
    132. #if DBG
    133.     static char* irpname[] = {
    134.         "IRP_MJ_CREATE",
    135.         "IRP_MJ_CREATE_NAMED_PIPE",
    136.         "IRP_MJ_CLOSE",
    137.         "IRP_MJ_READ",
    138.         "IRP_MJ_WRITE",
    139.         "IRP_MJ_QUERY_INFORMATION",
    140.         "IRP_MJ_SET_INFORMATION",
    141.         "IRP_MJ_QUERY_EA",
    142.         "IRP_MJ_SET_EA",
    143.         "IRP_MJ_FLUSH_BUFFERS",
    144.         "IRP_MJ_QUERY_VOLUME_INFORMATION",
    145.         "IRP_MJ_SET_VOLUME_INFORMATION",
    146.         "IRP_MJ_DIRECTORY_CONTROL",
    147.         "IRP_MJ_FILE_SYSTEM_CONTROL",
    148.         "IRP_MJ_DEVICE_CONTROL",
    149.         "IRP_MJ_INTERNAL_DEVICE_CONTROL",
    150.         "IRP_MJ_SHUTDOWN",
    151.         "IRP_MJ_LOCK_CONTROL",
    152.         "IRP_MJ_CLEANUP",
    153.         "IRP_MJ_CREATE_MAILSLOT",
    154.         "IRP_MJ_QUERY_SECURITY",
    155.         "IRP_MJ_SET_SECURITY",
    156.         "IRP_MJ_POWER",
    157.         "IRP_MJ_SYSTEM_CONTROL",
    158.         "IRP_MJ_DEVICE_CHANGE",
    159.         "IRP_MJ_QUERY_QUOTA",
    160.         "IRP_MJ_SET_QUOTA",
    161.         "IRP_MJ_PNP",
    162.         };
    163.  
    164.     UCHAR type = stack->MajorFunction;
    165.     if (type >= arraysize(irpname))
    166.         KdPrint((DRIVERNAME " - Unknown IRP, major type %X\n", type));
    167.     else
    168.         KdPrint((DRIVERNAME " - %s\n", irpname[type]));
    169. #endif
    170.  
    171.     // Pass request down without additional processing
    172.  
    173.     NTSTATUS status;
    174.     status = IoAcquireRemoveLock(&pdx->RemoveLock, Irp);
    175.     if (!NT_SUCCESS(status))
    176.         return CompleteRequest(Irp, status, 0);
    177.     IoSkipCurrentIrpStackLocation(Irp);
    178.     status = IoCallDriver(pdx->LowerDeviceObject, Irp);
    179.     IoReleaseRemoveLock(&pdx->RemoveLock, Irp);
    180.     return status;
    181.     }                           // DispatchAny
    182.  
    183. ///////////////////////////////////////////////////////////////////////////////
    184.  
    185. NTSTATUS DispatchPower(IN PDEVICE_OBJECT fido, IN PIRP Irp)
    186.     {                           // DispatchPower
    187.  
    188. #if DBG
    189.     PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(Irp);
    190.     ULONG fcn = stack->MinorFunction;
    191.  
    192.     static char* fcnname[] = {
    193.         "IRP_MN_WAIT_WAKE",
    194.         "IRP_MN_POWER_SEQUENCE",
    195.         "IRP_MN_SET_POWER",
    196.         "IRP_MN_QUERY_POWER",
    197.         };
    198.  
    199.     if (fcn == IRP_MN_SET_POWER || fcn == IRP_MN_QUERY_POWER)
    200.         {
    201.         static char* sysstate[] = {
    202.             "PowerSystemUnspecified",
    203.             "PowerSystemWorking",
    204.             "PowerSystemSleeping1",
    205.             "PowerSystemSleeping2",
    206.             "PowerSystemSleeping3",
    207.             "PowerSystemHibernate",
    208.             "PowerSystemShutdown",
    209.             "PowerSystemMaximum",
    210.             };
    211.  
    212.         static char* devstate[] = {
    213.             "PowerDeviceUnspecified",
    214.             "PowerDeviceD0",
    215.             "PowerDeviceD1",
    216.             "PowerDeviceD2",
    217.             "PowerDeviceD3",
    218.             "PowerDeviceMaximum",
    219.             };
    220.  
    221.         ULONG context = stack->Parameters.Power.SystemContext;
    222.         POWER_STATE_TYPE type = stack->Parameters.Power.Type;
    223.  
    224.         KdPrint((DRIVERNAME " - IRP_MJ_POWER (%s)", fcnname[fcn]));
    225.         if (type == SystemPowerState)
    226.             KdPrint((", SystemPowerState = %s\n", sysstate[stack->Parameters.Power.State.SystemState]));
    227.         else
    228.             KdPrint((", DevicePowerState = %s\n", devstate[stack->Parameters.Power.State.DeviceState]));
    229.         }
    230.     else if (fcn < arraysize(fcnname))
    231.         KdPrint((DRIVERNAME " - IRP_MJ_POWER (%s)\n", fcnname[fcn]));
    232.     else
    233.         KdPrint((DRIVERNAME " - IRP_MJ_POWER (%2.2X)\n", fcn));
    234.  
    235. #endif // DBG
    236.  
    237.     PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fido->DeviceExtension;
    238.     PoStartNextPowerIrp(Irp);   // must be done while we own the IRP
    239.     NTSTATUS status;
    240.     status = IoAcquireRemoveLock(&pdx->RemoveLock, Irp);
    241.     if (!NT_SUCCESS(status))
    242.         return CompleteRequest(Irp, status, 0);
    243.     IoSkipCurrentIrpStackLocation(Irp);
    244.     status = PoCallDriver(pdx->LowerDeviceObject, Irp);
    245.     IoReleaseRemoveLock(&pdx->RemoveLock, Irp);
    246.     return status;
    247.     }                           // DispatchPower
    248.  
    249. ///////////////////////////////////////////////////////////////////////////////
    250.  
    251. NTSTATUS DispatchPnp(IN PDEVICE_OBJECT fido, IN PIRP Irp)
    252.     {                           // DispatchPnp
    253.     PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(Irp);
    254.     ULONG fcn = stack->MinorFunction;
    255.  
    256.     NTSTATUS status;
    257.     PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fido->DeviceExtension;
    258.     status = IoAcquireRemoveLock(&pdx->RemoveLock, Irp);
    259.     if (!NT_SUCCESS(status))
    260.         return CompleteRequest(Irp, status, 0);
    261.  
    262. #if DBG
    263.  
    264.     static char* pnpname[] = {
    265.         "IRP_MN_START_DEVICE",
    266.         "IRP_MN_QUERY_REMOVE_DEVICE",
    267.         "IRP_MN_REMOVE_DEVICE",
    268.         "IRP_MN_CANCEL_REMOVE_DEVICE",
    269.         "IRP_MN_STOP_DEVICE",
    270.         "IRP_MN_QUERY_STOP_DEVICE",
    271.         "IRP_MN_CANCEL_STOP_DEVICE",
    272.         "IRP_MN_QUERY_DEVICE_RELATIONS",
    273.         "IRP_MN_QUERY_INTERFACE",
    274.         "IRP_MN_QUERY_CAPABILITIES",
    275.         "IRP_MN_QUERY_RESOURCES",
    276.         "IRP_MN_QUERY_RESOURCE_REQUIREMENTS",
    277.         "IRP_MN_QUERY_DEVICE_TEXT",
    278.         "IRP_MN_FILTER_RESOURCE_REQUIREMENTS",
    279.         "",
    280.         "IRP_MN_READ_CONFIG",
    281.         "IRP_MN_WRITE_CONFIG",
    282.         "IRP_MN_EJECT",
    283.         "IRP_MN_SET_LOCK",
    284.         "IRP_MN_QUERY_ID",
    285.         "IRP_MN_QUERY_PNP_DEVICE_STATE",
    286.         "IRP_MN_QUERY_BUS_INFORMATION",
    287.         "IRP_MN_DEVICE_USAGE_NOTIFICATION",
    288.         "IRP_MN_SURPRISE_REMOVAL",
    289.         "IRP_MN_QUERY_LEGACY_BUS_INFORMATION",
    290.         };
    291.  
    292.     if (fcn < arraysize(pnpname))
    293.         KdPrint((DRIVERNAME " - IRP_MJ_PNP (%s)\n", pnpname[fcn]));
    294.     else
    295.         KdPrint((DRIVERNAME " - IRP_MJ_PNP (%2.2X)\n", fcn));
    296.  
    297. #endif // DBG
    298.  
    299.     // Handle usage notification specially in order to track power pageable
    300.     // flag correctly. We need to avoid allowing a non-pageable handler to be
    301.     // layered on top of a pageable handler.
    302.  
    303.     if (fcn == IRP_MN_DEVICE_USAGE_NOTIFICATION)
    304.         {                       // usage notification
    305.         if (!fido->AttachedDevice || (fido->AttachedDevice->Flags & DO_POWER_PAGABLE))
    306.             fido->Flags |= DO_POWER_PAGABLE;
    307.         IoCopyCurrentIrpStackLocationToNext(Irp);
    308.         IoSetCompletionRoutine(Irp, (PIO_COMPLETION_ROUTINE) UsageNotificationCompletionRoutine,
    309.             (PVOID) pdx, TRUE, TRUE, TRUE);
    310.         return IoCallDriver(pdx->LowerDeviceObject, Irp);
    311.         }                       // usage notification
    312.  
    313.     // Handle start device specially in order to correctly inherit
    314.     // FILE_REMOVABLE_MEDIA
    315.  
    316.     if (fcn == IRP_MN_START_DEVICE)
    317.         {                       // device start
    318.         IoCopyCurrentIrpStackLocationToNext(Irp);
    319.         IoSetCompletionRoutine(Irp, (PIO_COMPLETION_ROUTINE) StartDeviceCompletionRoutine,
    320.             (PVOID) pdx, TRUE, TRUE, TRUE);
    321.         return IoCallDriver(pdx->LowerDeviceObject, Irp);
    322.         }                       // device start
    323.  
    324.     // Handle remove device specially in order to cleanup device stack
    325.  
    326.     if (fcn == IRP_MN_REMOVE_DEVICE)
    327.         {                       // remove device
    328.         IoSkipCurrentIrpStackLocation(Irp);
    329.         status = IoCallDriver(pdx->LowerDeviceObject, Irp);
    330.         IoReleaseRemoveLockAndWait(&pdx->RemoveLock, Irp);
    331.         RemoveDevice(fido);
    332.         return status;
    333.         }                       // remove device
    334.  
    335.     // Simply forward any other type of PnP request
    336.  
    337.     IoSkipCurrentIrpStackLocation(Irp);
    338.     status = IoCallDriver(pdx->LowerDeviceObject, Irp);
    339.     IoReleaseRemoveLock(&pdx->RemoveLock, Irp);
    340.     return status;
    341.     }                           // DispatchPnp
    342.  
    343. ///////////////////////////////////////////////////////////////////////////////
    344. // GetDeviceTypeToUse returns the device object type of the next lower device
    345. // object. This helps overcome a bug in some Win2K file systems which expect the
    346. // topmost FiDO in a storage stack to have a VPB and, hence, to have been created
    347. // with a type such as FILE_DEVICE_DISK.
    348.  
    349.  
    350.  
    351. ULONG GetDeviceTypeToUse(PDEVICE_OBJECT pdo)
    352.     {                           // GetDeviceTypeToUse
    353.     PDEVICE_OBJECT ldo = IoGetAttachedDeviceReference(pdo);
    354.     if (!ldo)
    355.         return FILE_DEVICE_UNKNOWN;
    356.     ULONG devtype = ldo->DeviceType;
    357.     ObDereferenceObject(ldo);
    358.     return devtype;
    359.     }                           // GetDeviceTypeToUse
    360.  
    361. ///////////////////////////////////////////////////////////////////////////////
    362. VOID RemoveDevice(IN PDEVICE_OBJECT fido)
    363.     {                           // RemoveDevice
    364.     PAGED_CODE();
    365.     PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fido->DeviceExtension;
    366.     NTSTATUS status;
    367.  
    368.     if (pdx->LowerDeviceObject)
    369.         IoDetachDevice(pdx->LowerDeviceObject);
    370.  
    371.     IoDeleteDevice(fido);
    372.     }                           // RemoveDevice
    373.  
    374. ///////////////////////////////////////////////////////////////////////////////
    375.  
    376.  
    377. NTSTATUS StartDeviceCompletionRoutine(PDEVICE_OBJECT fido, PIRP Irp, PDEVICE_EXTENSION pdx)
    378.     {                           // StartDeviceCompletionRoutine
    379.     if (Irp->PendingReturned)
    380.         IoMarkIrpPending(Irp);
    381.  
    382.     // Inherit FILE_REMOVABLE_MEDIA flag from lower object. This is necessary
    383.     // for a disk filter, but it isn't available until start-device time. Drivers
    384.     // above us may examine the flag as part of their own start-device processing, too.
    385.  
    386.     if (pdx->LowerDeviceObject->Characteristics & FILE_REMOVABLE_MEDIA)
    387.         fido->Characteristics |= FILE_REMOVABLE_MEDIA;
    388.  
    389.     IoReleaseRemoveLock(&pdx->RemoveLock, Irp);
    390.     return STATUS_SUCCESS;
    391.     }                           // StartDeviceCompletionRoutine
    392.  
    393. ///////////////////////////////////////////////////////////////////////////////
    394.  
    395.  
    396.  
    397. NTSTATUS UsageNotificationCompletionRoutine(PDEVICE_OBJECT fido, PIRP Irp, PDEVICE_EXTENSION pdx)
    398.     {                           // UsageNotificationCompletionRoutine
    399.     if (Irp->PendingReturned)
    400.         IoMarkIrpPending(Irp);
    401.  
    402.     // If lower driver cleared pageable flag, we must do the same
    403.  
    404.     if (!(pdx->LowerDeviceObject->Flags & DO_POWER_PAGABLE))
    405.         fido->Flags &= ~DO_POWER_PAGABLE;
    406.  
    407.     IoReleaseRemoveLock(&pdx->RemoveLock, Irp);
    408.     return STATUS_SUCCESS;
    409.     }                           // UsageNotificationCompletionRoutine
    , но при сборке получил кучу ошибок)

    P.S Это код с моими ошибками
     
  13. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Пожалуйста, скажите, где ошибка в приведённом коде
     
  14. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Вот сам проэкт. Помогите, пожалуйста, его собрать
     
  15. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    напишите ошибки, которые возвращает компилятор... ддк нет под рукой...
     
  16. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Код (Text):
    1. 1>driverentry.cpp(9) : error C2157: 'DriverEntry' : must be declared before use in pragma list
    2. 1>driverentry.cpp(10) : error C2157: 'AddDevice' : must be declared before use in pragma list
    3. 1>driverentry.cpp(11) : error C2157: 'DriverUnload' : must be declared before use in pragma list
    4. 1>driverentry.cpp(12) : error C2157: 'DispatchAny' : must be declared before use in pragma list
    5. 1>driverentry.cpp(13) : error C2157: 'DispatchPower' : must be declared before use in pragma list
    6. 1>driverentry.cpp(14) : error C2157: 'DispatchPnp' : must be declared before use in pragma list
    7. 1>driverentry.cpp(15) : error C2157: 'DispatchWmi' : must be declared before use in pragma list
    8. 1>driverentry.cpp(16) : error C2157: 'GetDeviceTypeToUse' : must be declared before use in pragma list
    9. 1>driverentry.cpp(17) : error C2157: 'StartDeviceCompletionRoutine' : must be declared before use in pragma list
    10. 1>driverentry.cpp(18) : error C2157: 'UsageNotificationCompletionRoutine' : must be declared before use in pragma list
    11. 1>driverentry.cpp(28) : error C2065: 'DriverUnload' : undeclared identifier
    12. 1>driverentry.cpp(28) : error C2440: '=' : cannot convert from ''unknown-type'' to 'PDRIVER_UNLOAD'
    13. 1>driverentry.cpp(29) : error C2065: 'AddDevice' : undeclared identifier
    14. 1>driverentry.cpp(29) : error C2440: '=' : cannot convert from ''unknown-type'' to 'PDRIVER_ADD_DEVICE'
    15. 1>driverentry.cpp(32) : error C2065: 'DispatchAny' : undeclared identifier
    16. 1>driverentry.cpp(32) : error C2440: '=' : cannot convert from ''unknown-type'' to 'PDRIVER_DISPATCH'
    17. 1>driverentry.cpp(34) : error C2065: 'DispatchPower' : undeclared identifier
    18. 1>driverentry.cpp(34) : error C2440: '=' : cannot convert from ''unknown-type'' to 'PDRIVER_DISPATCH'
    19. 1>driverentry.cpp(35) : error C2065: 'DispatchPnp' : undeclared identifier
    20. 1>driverentry.cpp(35) : error C2440: '=' : cannot convert from ''unknown-type'' to 'PDRIVER_DISPATCH'
    21. 1>driverentry.cpp(43) : error C2365: 'DriverUnload' : redefinition; previous definition was a 'formerly unknown identifier'
    22. 1>driverentry.cpp(51) : error C2365: 'AddDevice' : redefinition; previous definition was a 'formerly unknown identifier'
    23. 1>driverentry.cpp(64) : error C2065: 'GetDeviceTypeToUse' : undeclared identifier
    24. 1>driverentry.cpp(128) : error C2365: 'DispatchAny' : redefinition; previous definition was a 'formerly unknown identifier'
    25. 1>driverentry.cpp(186) : error C2365: 'DispatchPower' : redefinition; previous definition was a 'formerly unknown identifier'
    26. 1>driverentry.cpp(252) : error C2365: 'DispatchPnp' : redefinition; previous definition was a 'formerly unknown identifier'
    27. 1>driverentry.cpp(309) : error C2065: 'UsageNotificationCompletionRoutine' : undeclared identifier
    28. 1>driverentry.cpp(309) : error C2440: '=' : cannot convert from ''unknown-type'' to 'PIO_COMPLETION_ROUTINE'
    29. 1>driverentry.cpp(320) : error C2065: 'StartDeviceCompletionRoutine' : undeclared identifier
    30. 1>driverentry.cpp(320) : error C2440: '=' : cannot convert from ''unknown-type'' to 'PIO_COMPLETION_ROUTINE'
    31. 1>driverentry.cpp(352) : error C2365: 'GetDeviceTypeToUse' : redefinition; previous definition was a 'formerly unknown identifier'
    32. 1>driverentry.cpp(378) : error C2365: 'StartDeviceCompletionRoutine' : redefinition; previous definition was a 'formerly unknown identifier'
    33. 1>driverentry.cpp(398) : error C2365: 'UsageNotificationCompletionRoutine' : redefinition; previous definition was a 'formerly unknown identifier'
     
  17. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    попробуйте поменять содержимое driver.h на следующее:
    Код (Text):
    1. // Declarations for filter driver
    2. // Copyright (C) 1999 by Walter Oney
    3. // All rights reserved
    4.  
    5. #ifndef DRIVER_H
    6. #define DRIVER_H
    7.  
    8. #define DRIVERNAME "FILTER"                 // for use in messages
    9.  
    10. ///////////////////////////////////////////////////////////////////////////////
    11. // Device extension structure
    12.  
    13. typedef struct tagDEVICE_EXTENSION {
    14.     PDEVICE_OBJECT DeviceObject;            // device object this extension belongs to
    15.     PDEVICE_OBJECT LowerDeviceObject;       // next lower driver in same stack
    16.     PDEVICE_OBJECT Pdo;                     // the PDO
    17.     IO_REMOVE_LOCK RemoveLock;
    18.     } DEVICE_EXTENSION, *PDEVICE_EXTENSION;
    19.  
    20. ///////////////////////////////////////////////////////////////////////////////
    21. // Global functions
    22.  
    23. VOID RemoveDevice(IN PDEVICE_OBJECT fdo);
    24. NTSTATUS CompleteRequest(IN PIRP Irp, IN NTSTATUS status, IN ULONG_PTR info);
    25.  
    26. // Driver Entry Functions
    27. NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath);
    28. VOID DriverUnload(IN PDRIVER_OBJECT DriverObject);
    29. NTSTATUS AddDevice(IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT pdo);
    30. NTSTATUS CompleteRequest(IN PIRP Irp, IN NTSTATUS status, IN ULONG_PTR info);
    31. NTSTATUS DispatchAny(IN PDEVICE_OBJECT fido, IN PIRP Irp);
    32. NTSTATUS DispatchPower(IN PDEVICE_OBJECT fido, IN PIRP Irp);
    33. NTSTATUS DispatchPnp(IN PDEVICE_OBJECT fido, IN PIRP Irp);
    34. ULONG GetDeviceTypeToUse(PDEVICE_OBJECT pdo);
    35. VOID RemoveDevice(IN PDEVICE_OBJECT fido);
    36. NTSTATUS StartDeviceCompletionRoutine(PDEVICE_OBJECT fido, PIRP Irp, PDEVICE_EXTENSION pdx);
    37. NTSTATUS UsageNotificationCompletionRoutine(PDEVICE_OBJECT fido, PIRP Irp, PDEVICE_EXTENSION pdx);
    38.  
    39. #endif // DRIVER_H
     
  18. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Я сделал, как Вы сказали и ошибок стало меньше, но
    Код (Text):
    1. 1>driverentry.cpp(9) : error C2128: 'DriverEntry' : alloc_text/same_seg applicable only to functions with C linkage
    2. 1>driverentry.cpp(10) : error C2128: 'AddDevice' : alloc_text/same_seg applicable only to functions with C linkage
    3. 1>driverentry.cpp(11) : error C2128: 'DriverUnload' : alloc_text/same_seg applicable only to functions with C linkage
    4. 1>driverentry.cpp(12) : error C2128: 'DispatchAny' : alloc_text/same_seg applicable only to functions with C linkage
    5. 1>driverentry.cpp(13) : error C2128: 'DispatchPower' : alloc_text/same_seg applicable only to functions with C linkage
    6. 1>driverentry.cpp(14) : error C2128: 'DispatchPnp' : alloc_text/same_seg applicable only to functions with C linkage
    7. 1>driverentry.cpp(15) : error C2157: 'DispatchWmi' : must be declared before use in pragma list
    8. 1>driverentry.cpp(16) : error C2128: 'GetDeviceTypeToUse' : alloc_text/same_seg applicable only to functions with C linkage
    9. 1>driverentry.cpp(17) : error C2128: 'StartDeviceCompletionRoutine' : alloc_text/same_seg applicable only to functions with C linkage
    10. 1>driverentry.cpp(18) : error C2128: 'UsageNotificationCompletionRoutine' : alloc_text/same_seg applicable only to functions with C linkage
     
  19. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    странная такая ошибка... собираете, как си код? а если так:
    Код (Text):
    1. // Declarations for filter driver
    2. // Copyright (C) 1999 by Walter Oney
    3. // All rights reserved
    4.  
    5. #ifndef DRIVER_H
    6. #define DRIVER_H
    7.  
    8. #define DRIVERNAME "FILTER"                    // for use in messages
    9.  
    10. ///////////////////////////////////////////////////////////////////////////////
    11. // Device extension structure
    12.  
    13. typedef struct tagDEVICE_EXTENSION {
    14.     PDEVICE_OBJECT DeviceObject;            // device object this extension belongs to
    15.     PDEVICE_OBJECT LowerDeviceObject;        // next lower driver in same stack
    16.     PDEVICE_OBJECT Pdo;                        // the PDO
    17.     IO_REMOVE_LOCK RemoveLock;
    18.     } DEVICE_EXTENSION, *PDEVICE_EXTENSION;
    19.  
    20. ///////////////////////////////////////////////////////////////////////////////
    21. // Global functions
    22.  
    23. VOID RemoveDevice(IN PDEVICE_OBJECT fdo);
    24. NTSTATUS CompleteRequest(IN PIRP Irp, IN NTSTATUS status, IN ULONG_PTR info);
    25.  
    26. // Driver Entry Functions
    27. extern "C" {
    28. NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath);
    29. VOID DriverUnload(IN PDRIVER_OBJECT DriverObject);
    30. NTSTATUS AddDevice(IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT pdo);
    31. NTSTATUS CompleteRequest(IN PIRP Irp, IN NTSTATUS status, IN ULONG_PTR info);
    32. NTSTATUS DispatchAny(IN PDEVICE_OBJECT fido, IN PIRP Irp);
    33. NTSTATUS DispatchPower(IN PDEVICE_OBJECT fido, IN PIRP Irp);
    34. NTSTATUS DispatchPnp(IN PDEVICE_OBJECT fido, IN PIRP Irp);
    35. ULONG GetDeviceTypeToUse(PDEVICE_OBJECT pdo);
    36. VOID RemoveDevice(IN PDEVICE_OBJECT fido);
    37. NTSTATUS StartDeviceCompletionRoutine(PDEVICE_OBJECT fido, PIRP Irp, PDEVICE_EXTENSION pdx);
    38. NTSTATUS UsageNotificationCompletionRoutine(PDEVICE_OBJECT fido, PIRP Irp, PDEVICE_EXTENSION pdx);
    39. }
    40.  
    41. #endif // DRIVER_H
     
  20. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Rel, было ещё 3 ошибки, но я их смог устранить саморучно и 2 obj слинковаль! Отсюда можно сделать вывод, для того чтобы вставить в асм фунции из исходника на С, нужно объявлять их не в главном модуле, а в *.h, как это сейчас сделали мы с Вами.
    Но у меня есть последная просьба. Пожалуйста, переведите на амс функции DispatchPnp и AddDevice. Они, конечно, и так работают. Просто мне надо кое-что в них добавить