2015-06-10 3 views
0

Я получаю lvalue required as left operand error на LoByte/HiByte/LODWORD линиях в функции ниже:именующий требуется в качестве левого операнда назначения - LoByte/HiByte

typedef DWORD _DWORD; 
typedef BYTE _BYTE; 
typedef WORD _WORD; 

signed int __stdcall checkSerial(int serial, int serialLength) 
{ 
    int v2; // [email protected] 
    int v3; // [email protected] 
    int v4; // [email protected] 
    int v5; // [email protected] 
    int v6; // [email protected] 
    signed int v7; // [email protected] 
    char v8; // [email protected] 
    __int16 v9; // [email protected] 
    signed int result; // [email protected] 

    v2 = 0; 
    do 
    { 
    *(_DWORD *)(v2 + serial) ^= 0x1234567u; 
    *(_BYTE *)(v2 + serial) &= 0xEu; 
    v2 += 4; 
    } 
    while (v2 != 8); 
    v3 = 0; 
    do 
    *(_BYTE *)(serial + 8) += *(_BYTE *)(v3++ + serial); 
    while (v3 != serialLength); 
    v4 = 0; 
    do 
    { 
    *(_DWORD *)(v4 + serial) ^= 0x89ABCDEu; 
    *(_BYTE *)(v4 + serial) &= 0xEu; 
    v4 += 4; 
    } 
    while (v4 != 8); 
    v5 = 0; 
    do 
    *(_BYTE *)(serial + 9) += *(_BYTE *)(v5++ + serial); 
    while (v5 != serialLength); 
    LOBYTE(v6) = *(_BYTE *)(serial + 9); 
    HIBYTE(v6) = *(_BYTE *)(serial + 8); 
    if (v6 != 0x42DE) 
    goto LABEL_25; 
    v7 = 9; 
    do 
    { 
    v8 = *(_BYTE *)(v7 + serial)^*(_BYTE *)(v7 + serial); 
    --v7; 
    } 
    while ((_WORD)v7); 
    if ((*(_WORD *)(serial + 8)^0xEEEE) != 0x30AC) 
    goto LABEL_25; 
    LOBYTE(v9) = *(_BYTE *)serial; 
    HIBYTE(v9) = *(_BYTE *)(serial + 1); 
    if (v9 != 0xB008u) 
    goto LABEL_25; 
    if (*(_DWORD *)serial != 0x7A81B008) 
    goto LABEL_25; 
    LOWORD(v7) = 0; 
    do 
    { 
    v8 ^= 0xAu; 
    v7 += 4; 
    } 
    while (v7 <= 12); 
    if (*(_DWORD *)(serial + 4) != 0x388DBF02 
    || *(_BYTE *)(serial + 5) != 191 
    || *(_BYTE *)(serial + 6) != 141 
    || *(_BYTE *)(serial + 5) != 191) 
LABEL_25: 
    result = 1; 
    else 
    result = 0; 
    return result; 
} 

LoByte (v9) = * (_ BYTE *) последовательный; HIBYTE (v9) = * (_ BYTE *) (serial + 1);

например. эти строки вызывают ошибку, но почему? LOBYTE определяется как LOBYTE (x) ((BYTE) (x)), так почему я не могу просто бросить его?

+0

Назначьте оба байта за один раз, используя shift ops –

ответ

0

Способ изменить подмножество стоимости с использованием логических операторов, например:

v9 &= ~255; // mask off low byte (set to 0) 
v9 |= *(_BYTE*)serial; // or in the new low byte value 

Но так как вы изменяете оба байта из 16 битного значения самый простой способ, чтобы просто назначить его в одна операция:

v9 = (*(_BYTE*)(*serial + 1) << 8) | (*(_BYTE*)serial);