unsigned
int
__cdecl _read_nolock(
int
FileHandle,
LPVOID
lpBuffer,
DWORD
nNumberOfBytesToRead)
{
DWORD
v3;
unsigned
int
result;
int
*v5;
int
v6;
int
v7;
char
v8;
CHAR
*v9;
int
v10;
int
v11;
int
v12;
int
v13;
CHAR
*v14;
CHAR
v15;
bool
v16;
int
v17;
CHAR
v18;
int
v19;
CHAR
v20;
int
v21;
int
v22;
char
*v23;
CHAR
*v24;
CHAR
v25;
_BYTE *v26;
_BYTE *v27;
int
v28;
int
v29;
char
v30;
_BYTE *v31;
int
v32;
unsigned
int
v33;
int
v34;
BOOL
v35;
CHAR
*v36;
int
v37;
_BYTE *v38;
__int16
v39;
DWORD
v40;
DWORD
NumberOfBytesRead;
unsigned
int
v42;
LPCCH lpMultiByteStr;
unsigned
int
v44;
__int16
v45;
char
v46;
char
Buffer;
LPCCH nNumberOfBytesToReada;
LPCCH nNumberOfBytesToReadb;
v3 = nNumberOfBytesToRead;
v42 = -2;
v40 = nNumberOfBytesToRead;
if
( FileHandle == -2 )
{
*__doserrno() = 0;
*_errno() = 9;
return
-1;
}
if
( FileHandle < 0 || FileHandle >= uNumber )
{
*__doserrno() = 0;
*_errno() = 9;
_invalid_parameter_noinfo();
return
-1;
}
v5 = &dword_10DEADC0[FileHandle >> 5];
v6 = *v5;
v7 = (FileHandle & 0x1F) << 6;
v8 = *(_BYTE *)(*v5 + v7 + 4);
if
( (v8 & 1) == 0 )
{
*__doserrno() = 0;
*_errno() = 9;
LABEL_19:
_invalid_parameter_noinfo();
return
-1;
}
if
( nNumberOfBytesToRead > 0x7FFFFFFF )
goto
LABEL_18;
v44 = 0;
if
( !nNumberOfBytesToRead || (v8 & 2) != 0 )
return
0;
if
( !lpBuffer )
goto
LABEL_18;
v46 = (
char
)(2 * *(_BYTE *)(v6 + v7 + 36)) >> 1;
if
( v46 != 1 )
{
if
( v46 != 2 )
{
LABEL_16:
v9 = (
CHAR
*)lpBuffer;
lpMultiByteStr = (LPCCH)lpBuffer;
goto
LABEL_26;
}
if
( (nNumberOfBytesToRead & 1) == 0 )
{
nNumberOfBytesToRead &= 0xFFFFFFFE;
goto
LABEL_16;
}
LABEL_18:
*__doserrno() = 0;
*_errno() = 22;
goto
LABEL_19;
}
if
( (nNumberOfBytesToRead & 1) != 0 )
goto
LABEL_18;
nNumberOfBytesToRead = 4;
if
( v3 >> 1 >= 4 )
nNumberOfBytesToRead = v3 >> 1;
v9 = (
CHAR
*)_malloc_crt(nNumberOfBytesToRead);
lpMultiByteStr = v9;
if
( !v9 )
{
*_errno() = 12;
*__doserrno() = 8;
return
-1;
}
v10 = _lseeki64_nolock(FileHandle, 0, 0, 1u);
v11 = *v5;
*(_DWORD *)(v7 + v11 + 40) = v10;
*(_DWORD *)(v7 + v11 + 44) = v12;
LABEL_26:
v13 = v7 + *v5;
v14 = v9;
if
( (*(_BYTE *)(v13 + 4) & 0x48) != 0 )
{
v15 = *(_BYTE *)(v13 + 5);
if
( v15 != 10 )
{
if
( nNumberOfBytesToRead )
{
--nNumberOfBytesToRead;
v16 = v46 == 0;
*v9 = v15;
v17 = *v5;
v14 = v9 + 1;
v44 = 1;
*(_BYTE *)(v7 + v17 + 5) = 10;
if
( !v16 )
{
v18 = *(_BYTE *)(v7 + *v5 + 37);
if
( v18 != 10 )
{
if
( nNumberOfBytesToRead )
{
*v14 = v18;
v19 = *v5;
v14 = v9 + 2;
--nNumberOfBytesToRead;
v16 = v46 == 1;
v44 = 2;
*(_BYTE *)(v7 + v19 + 37) = 10;
if
( v16 )
{
v20 = *(_BYTE *)(v7 + *v5 + 38);
if
( v20 != 10 )
{
if
( nNumberOfBytesToRead )
{
*v14 = v20;
v21 = *v5;
v14 = v9 + 3;
--nNumberOfBytesToRead;
v44 = 3;
*(_BYTE *)(v7 + v21 + 38) = 10;
}
}
}
}
}
}
}
}
}
if
( !ReadFile(*(
HANDLE
*)(v7 + *v5), v14, nNumberOfBytesToRead, &NumberOfBytesRead, 0)
|| (NumberOfBytesRead & 0x80000000) != 0
|| NumberOfBytesRead > nNumberOfBytesToRead )
{
v33 = GetLastError();
if
( v33 == 5 )
{
*_errno() = 9;
*__doserrno() = 5;
goto
LABEL_93;
}
if
( v33 == 109 )
{
v42 = 0;
goto
$error_return$29001;
}
goto
LABEL_92;
}
v22 = *v5;
v44 += NumberOfBytesRead;
v23 = (
char
*)(v7 + v22 + 4);
if
( *v23 < 0 )
{
if
( v46 != 2 )
{
if
( NumberOfBytesRead && *v9 == 10 )
*v23 |= 4u;
else
*v23 &= 0xFBu;
v24 = (
CHAR
*)lpMultiByteStr;
nNumberOfBytesToReada = lpMultiByteStr;
v44 += (unsigned
int
)lpMultiByteStr;
if
( (unsigned
int
)lpMultiByteStr < v44 )
{
do
{
v25 = *nNumberOfBytesToReada;
if
( *nNumberOfBytesToReada == 26 )
{
v26 = (_BYTE *)(v7 + *v5 + 4);
if
( (*v26 & 0x40) != 0 )
*v24++ = *nNumberOfBytesToReada;
else
*v26 |= 2u;
break
;
}
if
( v25 == 13 )
{
if
( (unsigned
int
)nNumberOfBytesToReada < v44 - 1 )
{
if
( nNumberOfBytesToReada[1] == 10 )
{
nNumberOfBytesToReada += 2;
goto
LABEL_52;
}
++nNumberOfBytesToReada;
LABEL_63:
*v24 = 13;
LABEL_64:
++v24;
continue
;
}
++nNumberOfBytesToReada;
if
( !ReadFile(*(
HANDLE
*)(v7 + *v5), &Buffer, 1u, &NumberOfBytesRead, 0) && GetLastError()
|| !NumberOfBytesRead )
{
goto
LABEL_63;
}
if
( (*(_BYTE *)(v7 + *v5 + 4) & 0x48) != 0 )
{
if
( Buffer != 10 )
{
*v24 = 13;
*(_BYTE *)(v7 + *v5 + 5) = Buffer;
goto
LABEL_64;
}
LABEL_52:
*v24 = 10;
goto
LABEL_64;
}
if
( v24 == lpMultiByteStr && Buffer == 10 )
goto
LABEL_52;
_lseeki64_nolock(FileHandle, -1, -1, 1u);
if
( Buffer != 10 )
goto
LABEL_63;
}
else
{
*v24++ = v25;
++nNumberOfBytesToReada;
}
}
while
( (unsigned
int
)nNumberOfBytesToReada < v44 );
}
v44 = v24 - lpMultiByteStr;
if
( v46 != 1 || v24 == lpMultiByteStr )
goto
$error_return$29001;
v27 = v24 - 1;
LOBYTE(v28) = *v27;
if
( (
char
)*v27 < 0 )
{
v29 = 1;
v28 = (unsigned
__int8
)v28;
while
( !byte_10921C60[v28] && v29 <= 4 && v27 >= lpMultiByteStr )
{
v28 = (unsigned
__int8
)*--v27;
++v29;
}
v30 = *v27;
if
( !byte_10921C60[(unsigned
__int8
)*v27] )
{
*_errno() = 42;
LABEL_93:
v42 = -1;
goto
$error_return$29001;
}
if
( byte_10921C60[(unsigned
__int8
)*v27] + 1 == v29 )
{
v27 += v29;
}
else
if
( (*(_BYTE *)(*v5 + v7 + 4) & 0x48) != 0 )
{
v31 = v27 + 1;
*(_BYTE *)(*v5 + v7 + 5) = v30;
if
( v29 >= 2 )
*(_BYTE *)(v7 + *v5 + 37) = *v31++;
if
( v29 == 3 )
*(_BYTE *)(v7 + *v5 + 38) = *v31++;
v27 = &v31[-v29];
}
else
{
_lseeki64_nolock(FileHandle, -v29, -v29 >> 31, 1u);
}
}
else
{
++v27;
}
v32 = v27 - lpMultiByteStr;
v44 = MultiByteToWideChar(0xFDE9u, 0, lpMultiByteStr, v32, (
LPWSTR
)lpBuffer, v40 >> 1);
if
( v44 )
{
v34 = *v5;
v35 = v44 != v32;
v44 *= 2;
*(_DWORD *)(v7 + v34 + 48) = v35;
goto
$error_return$29001;
}
v33 = GetLastError();
LABEL_92:
_dosmaperr(v33);
goto
LABEL_93;
}
if
( NumberOfBytesRead && *(_WORD *)v9 == 10 )
*v23 |= 4u;
else
*v23 &= 0xFBu;
v36 = (
CHAR
*)lpMultiByteStr;
nNumberOfBytesToReadb = lpMultiByteStr;
v44 += (unsigned
int
)lpMultiByteStr;
if
( (unsigned
int
)lpMultiByteStr >= v44 )
{
LABEL_129:
v44 = v36 - lpMultiByteStr;
goto
$error_return$29001;
}
while
( 1 )
{
v37 = *(unsigned
__int16
*)nNumberOfBytesToReadb;
if
( v37 == 26 )
{
v38 = (_BYTE *)(v7 + *v5 + 4);
if
( (*v38 & 0x40) != 0 )
{
*(_WORD *)v36 = *(_WORD *)nNumberOfBytesToReadb;
v36 += 2;
}
else
{
*v38 |= 2u;
}
goto
LABEL_129;
}
if
( v37 == 13 )
{
if
( (unsigned
int
)nNumberOfBytesToReadb < v44 - 2 )
{
if
( *((_WORD *)nNumberOfBytesToReadb + 1) == 10 )
{
nNumberOfBytesToReadb += 4;
goto
LABEL_110;
}
nNumberOfBytesToReadb += 2;
LABEL_121:
v39 = 13;
LABEL_122:
*(_WORD *)v36 = v39;
goto
LABEL_123;
}
nNumberOfBytesToReadb += 2;
if
( !ReadFile(*(
HANDLE
*)(v7 + *v5), &v45, 2u, &NumberOfBytesRead, 0) && GetLastError() || !NumberOfBytesRead )
goto
LABEL_121;
if
( (*(_BYTE *)(v7 + *v5 + 4) & 0x48) != 0 )
{
if
( v45 != 10 )
{
*(_WORD *)v36 = 13;
*(_BYTE *)(v7 + *v5 + 5) = v45;
*(_BYTE *)(v7 + *v5 + 37) = HIBYTE(v45);
*(_BYTE *)(v7 + *v5 + 38) = 10;
LABEL_123:
v36 += 2;
goto
LABEL_124;
}
LABEL_110:
v39 = 10;
goto
LABEL_122;
}
if
( v36 == lpMultiByteStr && v45 == 10 )
goto
LABEL_110;
_lseeki64_nolock(FileHandle, -2, -1, 1u);
if
( v45 != 10 )
goto
LABEL_121;
}
else
{
*(_WORD *)v36 = v37;
v36 += 2;
nNumberOfBytesToReadb += 2;
}
LABEL_124:
if
( (unsigned
int
)nNumberOfBytesToReadb >= v44 )
goto
LABEL_129;
}
}
$error_return$29001:
if
( lpMultiByteStr != lpBuffer )
free
((
void
*)lpMultiByteStr);
result = v42;
if
( v42 == -2 )
result = v44;
return
result;
}