Дополнительные описатели типов
В документации и примерах DDK можно видеть относительно новые способы задания типов данных, которые внедряются там примерно с тем же энтузиазмом и размахом, как ранее это происходило с так называемой венгерской нотацией.
Помимо типов данных, представляющих сложные данные (структуры и объединения, типа DRIVER_OBJECT), в драйверных исходных текстах широко применяются новые обозначения известных стандартных типов данных. Заголовочный файл ntdef.h содержит множество определений, которые придают новый вид старым и хорошо известным описателям типов языка С. Например, описатели беззнаковых целых типов и указателей на переменные такого типа принимают вид:
typedef unsigned char UCHAR; typedef unsigned short USHORT; typedef unsigned long ULONG; ....... typedef UCHAR *PUCHAR; typedef USHORT *PUSHORT; typedef ULONG *PULONG; ....... typedef unsigned __int64 ULONGLONG; ....... typedef ULONGLONG *PULONGLONG;
Для чего это затеяна эта игра? В основном — для унификации стиля, когда в обращение вводятся совершенно новые типы данных, которые не являются базисными для языка С, скажем типа WCHAR (двухбайтный Unicode символ), или типа данных (а на самом деле — объединения) LARGE_INTEGER, наиболее часто используемого при программировании таймерных объектов, например:
typedef union _LARGE_INTEGER { struct { ULONG LowPart; LONG HighPart; }; struct { ULONG LowPart; LONG HighPart; } u; LONGLONG QuadPart; } LARGE_INTEGER;
Другая цель этих дополнений — достичь универсальности исходных текстов при переходе с 32-разрядных платформ на 64-разрядные.