| 187 | // pcbLengthNeeded - Receives number of bytes necessary to store the information |
| 188 | |
| 189 | bool WINAPI SFileGetFileInfo( |
| 190 | HANDLE hMpqOrFile, |
| 191 | SFileInfoClass InfoClass, |
| 192 | void * pvFileInfo, |
| 193 | DWORD cbFileInfo, |
| 194 | LPDWORD pcbLengthNeeded) |
| 195 | { |
| 196 | MPQ_SIGNATURE_INFO SignatureInfo; |
| 197 | const TCHAR * szSrcFileInfo; |
| 198 | TMPQArchive * ha = NULL; |
| 199 | TFileEntry * pFileEntry = NULL; |
| 200 | TMPQHeader * pHeader = NULL; |
| 201 | ULONGLONG Int64Value = 0; |
| 202 | ULONGLONG ByteOffset; |
| 203 | TMPQFile * hf = NULL; |
| 204 | void * pvSrcFileInfo = NULL; |
| 205 | DWORD cbSrcFileInfo = 0; |
| 206 | DWORD dwInt32Value = 0; |
| 207 | |
| 208 | // Validate archive/file handle |
| 209 | if((int)InfoClass <= (int)SFileMpqFlags) |
| 210 | { |
| 211 | if((ha = IsValidMpqHandle(hMpqOrFile)) == NULL) |
| 212 | return GetInfo_ReturdwErrCode(ERROR_INVALID_HANDLE); |
| 213 | pHeader = ha->pHeader; |
| 214 | } |
| 215 | else |
| 216 | { |
| 217 | if((hf = IsValidFileHandle(hMpqOrFile)) == NULL) |
| 218 | return GetInfo_ReturdwErrCode(ERROR_INVALID_HANDLE); |
| 219 | pFileEntry = hf->pFileEntry; |
| 220 | } |
| 221 | |
| 222 | // Return info-class-specific data |
| 223 | switch(InfoClass) |
| 224 | { |
| 225 | case SFileMpqFileName: |
| 226 | szSrcFileInfo = FileStream_GetFileName(ha->pStream); |
| 227 | cbSrcFileInfo = (DWORD)((_tcslen(szSrcFileInfo) + 1) * sizeof(TCHAR)); |
| 228 | return GetInfo(pvFileInfo, cbFileInfo, szSrcFileInfo, cbSrcFileInfo, pcbLengthNeeded); |
| 229 | |
| 230 | case SFileMpqStreamBitmap: |
| 231 | return FileStream_GetBitmap(ha->pStream, pvFileInfo, cbFileInfo, pcbLengthNeeded); |
| 232 | |
| 233 | case SFileMpqUserDataOffset: |
| 234 | return GetInfo(pvFileInfo, cbFileInfo, &ha->UserDataPos, sizeof(ULONGLONG), pcbLengthNeeded); |
| 235 | |
| 236 | case SFileMpqUserDataHeader: |
| 237 | if(ha->pUserData == NULL) |
| 238 | return GetInfo_ReturdwErrCode(ERROR_INVALID_PARAMETER); |
| 239 | return GetInfo_ReadFromFile(pvFileInfo, cbFileInfo, ha->pStream, ha->UserDataPos, sizeof(TMPQUserData), pcbLengthNeeded); |
| 240 | |
| 241 | case SFileMpqUserData: |
| 242 | if(ha->pUserData == NULL) |
| 243 | return GetInfo_ReturdwErrCode(ERROR_INVALID_PARAMETER); |
| 244 | return GetInfo_ReadFromFile(pvFileInfo, cbFileInfo, ha->pStream, ha->UserDataPos + sizeof(TMPQUserData), ha->pUserData->dwHeaderOffs - sizeof(TMPQUserData), pcbLengthNeeded); |
| 245 | |
| 246 | case SFileMpqHeaderOffset: |