DDK\Filespy

Тема в разделе "WASM.WIN32", создана пользователем LuckyDevil, 21 июл 2005.

  1. LuckyDevil

    LuckyDevil New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2005
    Сообщения:
    278
    Адрес:
    Uzbekistan
    Vsem dobrogo!!!

    U menya kak vsegda problemnii-vopros.

    Ya, pitalsya rasobrat'sya v ddk\filespy, vrode ponyatno, no ya popitlsya zapustit' driver i vot tut poyavilis' problemi. Na danii moment ya ne mogu ponyat' sleduyushee,

    ya pitayus' priattachit' disk "C:" i vot chto proishodit:

    1) visivaetsya FatsIODeviceControl(tut vse ponyatno)

    2) SpyCommonDeviceIoControl(tut toje ponyatno)

    3) SpyStartLoggingDevice

    4) SpyIsAttachedToDeviceByUserDeviceName, tut idet inicialisacya peremenih i popitka podklyuchenya, voobshem vse tut idet normal'no do vot etogo uchastka:
    Код (Text):
    1.  
    2.     // get a pointer to the volumes file object
    3.     //
    4.  
    5.     status = ObReferenceObjectByHandle( fileHandle,
    6.                                         FILE_READ_DATA,
    7.                                         *IoFileObjectType,
    8.                                         KernelMode,
    9.                                         &volumeFileObject,
    10.                                         NULL);
    11.  
    12.  


    posle vipolnenya ObReferenceObjectByHandle, pochemuto idet vozvrat v funkcyu SpyCommonDeviceIoControl, a samoe interesnoe chto imenno v etot uchastok koda
    Код (Text):
    1.  
    2.             if (NT_SUCCESS( IoStatus->Status )) {
    3.                
    4.                 deviceName[InputBufferLength / sizeof(WCHAR)] = UNICODE_NULL;
    5.                 IoStatus->Status = SpyStartLoggingDevice( deviceName );
    6.             }
    7.             break;  
    8.  


    i uje na sledyushem vitke pri vipolnenii ObReferenceObjectByHandle, driver vilitaet v BSOD.

    Pochemu emenno syuda idet vozvrat???
     
  2. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Исходник спая не подвергался улучшению с твоей стороны? И как понимать "idet vozvrat v funkcyu"? Судя по коду, если ObReferenceObjectByHandle обламывается, то управление возвращается в SpyStartLoggingDevice и оттуда сразу в SpyCommonDeviceIoControl. Так что никаких чудес. А что за BSOD? Код и параметры?


    Код (Text):
    1. SpyIsAttachedToDeviceByUserDeviceName (
    2. . . .
    3.     )
    4. {
    5.     . . .
    6.  
    7.     //
    8.     // get a pointer to the volumes file object
    9.     //
    10.  
    11.     status = ObReferenceObjectByHandle( . . . );
    12.  
    13.     if(!NT_SUCCESS( status )) {
    14.  
    15.         ZwClose( fileHandle );
    16.         return status;
    17.     }
    18.     . . .
    19. }
    20.  
    21.  
    22. SpyStartLoggingDevice (
    23. . . .
    24.     )
    25. {
    26.     . . .
    27.  
    28.     status = SpyIsAttachedToDeviceByUserDeviceName( . . . );
    29.  
    30.     if (!NT_SUCCESS( status )) {
    31.  
    32.         //
    33.         //  There was an error, so return the error code.
    34.         //
    35.        
    36.         return status;
    37.     }
    38.     . . .
    39. }
    40.  
    41.  
    42. SpyCommonDeviceIoControl (
    43. . . . .
    44.     )
    45. {
    46.     . . . .
    47.             if (NT_SUCCESS( IoStatus->Status )) {
    48.                
    49.                 deviceName[InputBufferLength / sizeof(WCHAR)] = UNICODE_NULL;
    50.                 IoStatus->Status = SpyStartLoggingDevice( deviceName );
    51.             }
    52.  
    53.             break;
    54.     . . . .
    55. }
     
  3. LuckyDevil

    LuckyDevil New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2005
    Сообщения:
    278
    Адрес:
    Uzbekistan
    Four-F, da bili koekakie izmenenya v kode i okasalos' eto exception, iz-za nego voznikala eta situacya, a prichina sboya ObReferenceObjectByHandle bila v etoi peremennoi *IoFileObjectType, obyasnite zachem ona nujna??? nigde bolee ona nevstrechaetsya krome kak ntddk i to prosto obyavlena.

    voobshem zameniv ee na "null", oshibka v etom uchastke koda ischezla. No po zaversheniyu SpyFatsIODeviceControl BSOD vse je poyavlyaetsy c oshibkoi "DRIVER_IRQL_NOT_LESS_OR_EQUAL", chto eto znachit?
    Код (Text):
    1. The computer has rebooted from a bugcheck.  
    2. The bugcheck was: 0x000000d1 (0x7c4e6582, 0x0000006c, 0x00000000, 0x7c4e6582).
    3. Microsoft Windows 2000 [v15.2195].
    4. A dump was saved in: C:\WINNT\MEMORY.DMP.




    Four-F, eshe y menya pros'ba, nadeyus' ne slishkom naglaya, mne nujnii otkompilirovannie failii filespy.sys filespy.exe dliya analiza, ochen' nujnii.
     
  4. LuckyDevil

    LuckyDevil New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2005
    Сообщения:
    278
    Адрес:
    Uzbekistan
    Код (Text):
    1.  
    2. **********************************************************************  *********
    3. *                                                                             *
    4. *                        Bugcheck Analysis                                    *
    5. *                                                                             *
    6. **********************************************************************  *********
    7.  
    8. DRIVER_IRQL_NOT_LESS_OR_EQUAL (d1)
    9. An attempt was made to access a pageable (or completely invalid) address at an
    10. interrupt request level (IRQL) that is too high.  This is usually
    11. caused by drivers using improper addresses.
    12. If kernel debugger is available get stack backtrace.
    13. Arguments:
    14. Arg1: 7c4e6582, memory referenced
    15. Arg2: 0000006c, IRQL
    16. Arg3: 00000000, value 0 = read operation, 1 = write operation
    17. Arg4: 7c4e6582, address which referenced memory
    18. Debugging Details:
    19. ------------------
    20.  
    21.  
    22. OVERLAPPED_MODULE:  vpc_s3_fba67000
    23.  
    24. READ_ADDRESS:  7c4e6582
    25.  
    26. CURRENT_IRQL:  6c
    27.  
    28. FAULTING_IP:
    29. kernel32!ReadFile+0
    30. 7c4e6582 ??               ???
    31.  
    32. DEFAULT_BUCKET_ID:  INTEL_CPU_MICROCODE_ZERO
    33.  
    34. BUGCHECK_STR:  0xD1
    35.  
    36. LAST_CONTROL_TRANSFER:  from 7c4e6582 to 80468b6f
    37.  
    38. STACK_TEXT:  
    39. fad6ad64 7c4e6582 00009481 fc658300 74c08500 nt!KiTrap0E+0x27c
    40. 0012ff3c 00402637 00000003 00406184 00000080 kernel32!ReadFile
    41. WARNING: Stack unwind information not available. Following frames may be wrong.
    42. 0012ffc0 7c4e87f5 e7ffffff 00000000 7ffdf000 Load+0x2637
    43. 0012fff0 00000000 00403f68 00000000 000000c8 kernel32!BaseProcessStart+0x3d
    44.  
    45.  
    46. FAILED_INSTRUCTION_ADDRESS:
    47. kernel32!ReadFile+0
    48. 7c4e6582 ??               ???
    49.  
    50. FOLLOWUP_IP:
    51. nt!KiTrap0E+27c
    52. 80468b6f f7457000000200   test    dword ptr [ebp+0x70],0x20000
    53.  
    54. SYMBOL_STACK_INDEX:  0
    55.  
    56. FOLLOWUP_NAME:  MachineOwner
    57.  
    58. SYMBOL_NAME:  nt!KiTrap0E+27c
    59.  
    60. MODULE_NAME:  nt
    61.  
    62. IMAGE_NAME:  ntoskrnl.exe
    63.  
    64. DEBUG_FLR_IMAGE_TIMESTAMP:  3ee6c002
    65.  
    66. STACK_COMMAND:  kb
    67.  
    68. FAILURE_BUCKET_ID:  0xD1_CODE_AV_BAD_IP_nt!KiTrap0E+27c
    69.  
    70. BUCKET_ID:  0xD1_CODE_AV_BAD_IP_nt!KiTrap0E+27c
    71.  
    72. Followup: MachineOwner
    73. ---------
    74.  


    nichego ne ponimayu, nujna pomosh
     
  5. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    IoFileObjectType - это указатель на переменную, в которой хранится указатель на структуру OBJECT_TYPE, описывающую объект "тип" для объектов "файл" ;) Если у тебя есть указатель на объект, то проверить, действительно ли это файл, событие, мьютекс... можно имея указатели на соответствующие объекты "тип": IoFileObjectType, ExMutantObjectType, ExEventPairObjectType ... ObReferenceObjectByHandle как раз это и делает.



    Объяснять всё это долго. Кое-что есть у Шрайбера, кое-что у Соломона, кое-что у меня проскакивало, кое-что тут: http://gl00my.chat.ru/nt/ob.txt



    Я как-то баловался написанием расширения для Kernel Debugger. Слей obx отсюда http://www.wasm.ru/toollist.php?list=21



    В заголовке каждого объекта есть указатель на OBJECT_TYPE для соответствующего типа. Вот пример испльзования:


    Код (Text):
    1. 038c: Object: 8135d488  GrantedAccess: 0012019f
    2. Object: 8135d488  Type: ([b]818a5b40[/b]) File
    3.     ObjectHeader: 8135d470
    4.         HandleCount: 1  PointerCount: 1
    5.         Directory Object: 00000000  Name: \Dbg1100 {NamedPipe}
    6.  
    7. kd> !load obx.dll
    8. kd> !obx.help
    9.    dob [options] <address>    - Dump the object body.   Print <!dob -h> for extra help
    10.    doh [options] <address>    - Dump the object header. Print <!doh -h> for extra help
    11.    dot [options] <address>    - Dump the object type.   Print <!dot -h> for extra help
    12.    help                       - Display this help
    13.    ver[sion]                  - Version of extension dll
    14. kd>
    15. kd> !dot poi(IoFileObjectType)
    16. OBJECT_TYPE {                                              at [b]0x818A5B40[/b]
    17.    +0x00 ERESOURCE               Mutex
    18.    +0x00   LIST_ENTRY            SystemResourcesList
    19.    +0x00     PLIST_ENTRY         Flink                     0x8053DE40
    20.    +0x04     PLIST_ENTRY         Blink                     0x818A5C40
    21.    +0x08   POWNER_ENTRY          OwnerTable                NULL
    22.    +0x0C   SHORT                 ActiveCount               0
    23.    +0x0E   USHORT                Flag                      0
    24.    +0x10   PKSEMAPHORE           SharedWaiters             NULL
    25.    +0x14   PKEVENT               ExclusiveWaiters          NULL
    26.    +0x18   OWNER_ENTRY           OwnerThreads[0]
    27.    +0x18     ERESOURCE_THREAD    OwnerThread               0
    28.              union {
    29.    +0x1C       LONG              OwnerCount                0
    30.    +0x1C       ULONG             TableSize                 0
    31.              }
    32.    +0x20   OWNER_ENTRY           OwnerThreads[1]
    33.    +0x20     ERESOURCE_THREAD    OwnerThread               0
    34.              union {
    35.    +0x24       LONG              OwnerCount                0
    36.    +0x24       ULONG             TableSize                 0
    37.              }
    38.    +0x28   ULONG                 ContentionCount           0
    39.    +0x2C   USHORT                NumberOfSharedWaiters     0
    40.    +0x2E   USHORT                NumberOfExclusiveWaiters  0
    41.            union {
    42.    +0x30     PVOID               Address                   NULL
    43.    +0x30     ULONG_PTR           CreatorBackTraceIndex     0
    44.            }
    45.    +0x34   KSPIN_LOCK            SpinLock                  0
    46.    +0x38 LIST_ENTRY              TypeList
    47.    +0x38   PLIST_ENTRY           Flink                     0x818A5B78
    48.    +0x3C   PLIST_ENTRY           Blink                     0x818A5B78
    49.    +0x40 UNICODE_STRING          Name
    50.    +0x40   USHORT Length                                   0x8
    51.    +0x42   USHORT MaximumLength                            0xA
    52.    +0x44   PWSTR  Buffer                                   0xE1477D88 "File"
    53.    +0x48 PVOID                   DefaultObject             0x0000005C
    54.    +0x4C ULONG                   Index                     26
    55.    +0x50 ULONG                   TotalNumberOfObjects      2799
    56.    +0x54 ULONG                   TotalNumberOfHandles      692
    57.    +0x58 ULONG                   HighWaterNumberOfObjects  3082
    58.    +0x5C ULONG                   HighWaterNumberOfHandles  723
    59.    +0x60 OBJECT_TYPE_INITIALIZER TypeInfo
    60.    +0x60   USHORT                Length                    0x4C
    61.    +0x62   BOOLEAN               UseDefaultObject          FALSE
    62.    +0x63   UCHAR                 Reserved                  0
    63.    +0x64   ULONG                 InvalidAttributes         0x00000130
    64.    +0x68   GENERIC_MAPPING       GenericMapping
    65.    +0x68     ACCESS_MASK         GenericRead               0x00120089
    66.    +0x6C     ACCESS_MASK         GenericWrite              0x00120116
    67.    +0x70     ACCESS_MASK         GenericExecute            0x001200a0
    68.    +0x74     ACCESS_MASK         GenericAll                0x001f01ff
    69.    +0x78   ULONG                 ValidAccessMask           0x001F01FF
    70.    +0x7C   BOOLEAN               SecurityRequired          FALSE
    71.    +0x7D   BOOLEAN               MaintainHandleCount       TRUE
    72.    +0x7E   BOOLEAN               MaintainTypeList          FALSE
    73.    +0x7F   ---
    74.    +0x80   POOL_TYPE             PoolType                  0 (NonPagedPool)
    75.    +0x84   ULONG                 DefaultPagedPoolCharge    0x400
    76.    +0x88   ULONG                 DefaultNonPagedPoolCharge 0xE8
    77.    +0x8C   PVOID                 DumpProcedure             NULL
    78.    +0x90   PVOID                 OpenProcedure             NULL
    79.    +0x94   PVOID                 CloseProcedure            0x8056D03B nt!IopCloseFile
    80.    +0x98   PVOID                 DeleteProcedure           0x804FA4C3 nt!IopDeleteFile
    81.    +0x9C   PVOID                 ParseProcedure            0x8056CF08 nt!IopParseFile
    82.    +0xA0   PVOID                 SecurityProcedure         0x8058A6DC nt!IopGetSetSecurityObject
    83.    +0xA4   PVOID                 QueryNameProcedure        0x8058CF93 nt!IopQueryName
    84.    +0xA8   PVOID                 OkayToCloseProcedure      NULL
    85.    +0xAC ULONG                   Key                       'eliF'
    86. }




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



    filespy ушел мылом.
     
  6. LuckyDevil

    LuckyDevil New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2005
    Сообщения:
    278
    Адрес:
    Uzbekistan
    Four-F, spasibo sa otveti i failii, seichas budu razberat'sya. No dumayu voprosi po teme eshe budut.
     
  7. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
  8. LuckyDevil

    LuckyDevil New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2005
    Сообщения:
    278
    Адрес:
    Uzbekistan
    Four-F, nashel structuru _OBJECT_TYPE
    Код (Text):
    1.  
    2. struct _OBJECT_TYPE {
    3.     _ERESOURCE Mutex;
    4.     _LIST_ENTRY TypeList;
    5.     _UNICODE_STRING Name;
    6.     void* DefaultObject;
    7.     DWORD Index;
    8.     DWORD TotalNumberOfObjects;
    9.     DWORD TotalNumberOfHandles;
    10.     DWORD HighWaterNumberOfObjects;
    11.     DWORD HighWaterNumberOfHandles;
    12.     _OBJECT_TYPE_INITIALIZER TypeInfo;
    13.     DWORD Key;
    14.     [b]_ERESOURCE ObjectLocks[4];[/b]
    15. };
    16.  


    ona nemno otlichaetsya ot tvoei, pochemu?
     
  9. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Об этом лучше спросить Свена ;) Я брал её из официальных символов. Точно не помню, но кажется я проверял, что она одинакова для w2k, XP и 2003 Server. Определение Свена возможно соответствует NT4, возможно получено путём медитации. В любом случае, подобные структуры не документированы, так что от версии к версии запросто могут меняться.
     
  10. LuckyDevil

    LuckyDevil New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2005
    Сообщения:
    278
    Адрес:
    Uzbekistan
    Four-F, vopros prosvuchit bit' mojet ochen' glupim, no...

    kak v masm importiruetsya peremennie, k primeru taje IoFileObjectType???
     
  11. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Код (Text):
    1.  
    2. mov ecx, ExEventObjectType
    3. mov ecx, [ecx]
    4. mov ecx, [ecx]          ; PTR OBJECT_TYPE
    5.  
    6. invoke ObReferenceObjectByHandle, edx, EVENT_MODIFY_STATE, ecx, \
    7.                                     UserMode, addr g_pkEventObject, NULL






    IoFileObjectType и прочие XxxObjectType так же.
     
  12. LuckyDevil

    LuckyDevil New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2005
    Сообщения:
    278
    Адрес:
    Uzbekistan
    a razve ti yavno v svoem kode ne ge ne obyavlyaesh o tom, chto, eta peremennaya bedet importirovana?
     
  13. LuckyDevil

    LuckyDevil New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2005
    Сообщения:
    278
    Адрес:
    Uzbekistan
    Four-F, Da eshe, MSDN nashel o IoFileObjectType, chto esli ObReferenceObjectByHandle visivaetsya KernelMode, to parametr POBJECT_TYPE doljen bit' Null. Pochemu je v filespy eto nesobludaetsya?
     
  14. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Ну я ведь нигде дополнительно не объявляю, что буду импортировать функцию ObReferenceObjectByHandle. Механизм экспортирования переменных и адресов функций ни чем не отличается, так что достаточно просто использовать переменную, а линкер сам разберется. Пример кода взят из KmdKit\examples\basic\Synchronization\SharedEvent - ProcessMon



    Потому что ObReferenceObjectByHandle, как и многие другие функции, на самом деле работает не так как написано в MSDN/DDK. Например, там пишут: "ObjectType can be either *IoFileObjectType or *ExEventObjectType." - это не верно. Это просто чтоб не использовали другие переменные XxxObjectType. А например, ObReferenceObjectByPointer вообще работает ну совсем не так как в доке написано (см. Часть 14 : Базовая техника. Синхронизация).



    Для того чтоб понять, почему спай делает именно так, надо лезть в исходный код ObReferenceObjectByHandle. Щас некогда, может завтра посмотрю.
     
  15. LuckyDevil

    LuckyDevil New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2005
    Сообщения:
    278
    Адрес:
    Uzbekistan
    Four-F, zaranie blagodaren, budu jdat'.
     
  16. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Собственно в исходный код ObReferenceObjectByHandle лезть не надо, и так всё ясно, достаточно подняться не пару строчек выше.


    Код (Text):
    1. InitializeObjectAttributes( &objectAttributes,
    2.                             &volumeNameUnicodeString,
    3.                             OBJ_CASE_INSENSITIVE | [b]OBJ_KERNEL_HANDLE[/b],
    4.                             NULL,
    5.                             NULL);
    6.  
    7. ZwCreateFile( . . . );
    8.  
    9. ObReferenceObjectByHandle( fileHandle,
    10.                            FILE_READ_DATA,
    11.                            *IoFileObjectType,
    12.                            KernelMode,
    13.                            &volumeFileObject,
    14.                            NULL );


    LuckyDevil, я уже много раз мусолил эту тему в статьях, но изволь.



    Сначала разберемся с KernelMode. Не знаю, что неписано в MSDN, но в DDK говорят: "This parameter can also be NULL if AccessMode is KernelMode." Т.е. может быть, но не должен. Если определить NULL, то ObReferenceObjectByHandle просто не будет проверять, а действительно ли хендл объекта соответствует объекту "файл" (в данном случае). Когда мы референсим хендл пришедший из юзер-моды, или хендл открытый пусть даже в ядре, но в контексте пользовательского процесса, то обязаны определить параметр ObjectType. Если этого не сделать, то ещё до того как мы успеем сделать референс другой поток пользовательского процесса может закрыть этот хендл и создать другой объект. Хендл нового объекта численно может совпасть с первоначальным значением и мы получим ссылку на объект совсем другого типа, но будем считать, что это файл. Также значение UserMode заставляет функцию проверить права доступа к объекту. Теперь обрати внимание на OBJ_KERNEL_HANDLE. Это означает, что хендл создаваемого объекта попадет не в таблицу хендлов текущего процесса, а в таблицу хендлов процесса System. К таким объектам режим ядра может обращаться из контекста любого процесса, а режим пользователя не может вообще. Т.е. спай создает файл в режиме ядра и помещает его в таблицу хендлов системного процесса. Поэтому и определяет KernelMode, т.к. точно знает, что хендл валиден. Вместо *IoFileObjectType он мог бы определить NULL. При этом ничего не изменилось бы, т.к. есть гарантия, что хендл соответствует и будет соответствовать именно обекту "файл". Случайно закрыть его может только ядро, а это исключено. Определяя *IoFileObjectType спай просто ещё больше ужесточает условия проверки и теоретически это абсолютно правильно. Надеюсь, понятно.



    Вот ключевой кусок из кода ObReferenceObjectByHandle:


    Код (Text):
    1. if ((ObjectHeader->Type == ObjectType) || (ObjectType == NULL)) {
    2.  
    3.     //  Работаем с объектом
    4.  
    5. } else {
    6.  
    7.     Status = STATUS_OBJECT_TYPE_MISMATCH;
    8. }


    Как видно, если явно не определить тип объекта, то ObReferenceObjectByHandle не проверяет совпадение типов и начинает работать с объектом. Если же тип объекта задан явно, например *IoFileObjectType, а хендл в действительности соответствует, скажем, объекту "событие", то функция вернет STATUS_OBJECT_TYPE_MISMATCH.



    Вот, на вскидку, имена переменных (многие экспортируются), в которых хранятся указатели на OBJECT_TYPE для соответствующих типов объектов. Все их можно передавать в функции ObReferenceObjectXxx для проверки типа объекта, а не только IoFileObjectType и ExEventObjectType, как пишут в DDK.



    ExEventPairObjectType

    PsProcessType

    PsThreadType

    PsJobType

    LpcPortObjectType

    LpcWaitablePortObjectType

    IoAdapterObjectType

    IoCompletionObjectType

    IoControllerObjectType

    IoDeviceObjectType

    IoDriverObjectType

    IoFileObjectType

    CmpKeyObjectType

    ExCallbackObjectType

    ExCallbackObjectType

    ExEventObjectType

    ExEventPairObjectType

    ExMutantObjectType

    ... продолжение следует ;)))
     
  17. LuckyDevil

    LuckyDevil New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2005
    Сообщения:
    278
    Адрес:
    Uzbekistan
    Four-F, thx ))). Ya izvinyayus' za svoyu tupost', no poka situacya imenno takaya.
     
  18. LuckyDevil

    LuckyDevil New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2005
    Сообщения:
    278
    Адрес:
    Uzbekistan
    u kogo est' opisanie structuri _EVENT_TYPE???
     
  19. LuckyDevil

    LuckyDevil New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2005
    Сообщения:
    278
    Адрес:
    Uzbekistan
    takoe
    Код (Text):
    1. typedef enum _EVENT_TYPE {
    2.     NotificationEvent,
    3.     SynchronizationEvent
    4. } EVENT_TYPE, *PEVENT_TYPE;
    ili ya oshibayus'?
     
  20. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Это не структура, а перечисление, а так всё верно.