Причиной сбоя этого кода на 64-битной версии является то, что он приводит указатели к ULONG.ULONG - это 32-разрядное значение, а указатели на 64-разрядные - это 64-разрядные значения.Таким образом, вы будете обрезать указатель всякий раз, когда будете использовать приведение ULONG.
Приведение PCHAR при условии, что PCHAR определено как char *
, хорошо, при условии, что намерение состоит в увеличении указателя на явное количество байтов.
Оба макроса имеют одинаковое назначение, но допустим только один из них, если указатели больше 32-битных.
Арифметика указателей работает следующим образом.Если у вас есть:
T *p;
и вы делаете:
p + n;
(где n - число), то значение p изменится на n * sizeof(T)
.
Чтобы привести конкретный пример, если у вас есть указатель на DWORD:
DWORD *pdw = &some_dword_in_memory;
, и вы добавляете один к нему:
pdw = pdw + 1;
, тогда вы будете указывать на следующийDWORD.Адрес, на который указывает pdw, будет увеличен на sizeof(DWORD)
, то есть на 4 байта.
Упомянутые вами макросы используют приведения, чтобы заставить смещения адресов, которые они применяют, умножаться на различные величины.Обычно это делается только в низкоуровневом коде, который был передан в буфер BYTE (или char или void), но знает, что данные внутри него действительно другого типа.