BOOL IsDiamondFile( IN PSTR FileName ) { FDICABINETINFO CabinetInfo; BOOL b; int h; if(!FdiContext) { return(FALSE); } // // Open the file such that the handle is valid for use // in the diamond context (ie, seek, read routines above). // h = SpdFdiOpen(FileName,_O_RDONLY,0); if(h == -1) { return(FALSE); } b = FDIIsCabinet(FdiContext,h,&CabinetInfo); SpdFdiClose(h); return(b); }
/* downloads a remote cabinet and extracts it if it exists */ static UINT msi_extract_remote_cabinet( MSIPACKAGE *package, struct media_info *mi ) { FDICABINETINFO cabinfo; WCHAR temppath[MAX_PATH]; WCHAR src[MAX_PATH]; LPSTR cabpath; LPCWSTR file; LPWSTR ptr; HFDI hfdi; ERF erf; int hf; /* the URL is the path prefix of the package URL and the filename * of the file to download */ ptr = strrchrW(package->PackagePath, '/'); lstrcpynW(src, package->PackagePath, ptr - package->PackagePath + 2); ptr = strrchrW(mi->source, '\\'); lstrcatW(src, ptr + 1); file = msi_download_file( src, temppath ); lstrcpyW(mi->source, file); /* check if the remote cabinet still exists, ignore if it doesn't */ hfdi = FDICreate(cabinet_alloc, cabinet_free, cabinet_open, cabinet_read, cabinet_write, cabinet_close, cabinet_seek, 0, &erf); if (!hfdi) { ERR("FDICreate failed\n"); return ERROR_FUNCTION_FAILED; } cabpath = strdupWtoA(mi->source); hf = cabinet_open(cabpath, _O_RDONLY, 0); if (!FDIIsCabinet(hfdi, hf, &cabinfo)) { WARN("Remote cabinet %s does not exist.\n", debugstr_w(mi->source)); msi_free(cabpath); return ERROR_SUCCESS; } msi_free(cabpath); return !extract_cabinet_file(package, mi->source, mi->last_path); }
uint STDCALL gcabd_iscabinet( HFDI hfdi, pubyte cabfile, pdecabinfo pdecab ) { int hf; uint ret; again: hf = file_open( cabfile, _O_BINARY | _O_RDONLY | _O_SEQUENTIAL, 0 ); if ( hf == -1 ) { (( gentee_call )pdecab->call)( pdecab->fncsysnotify, &ret, FLN_ERROPEN, cabfile, pdecab ); if ( ret ) goto again; return 0; } ret = FDIIsCabinet( hfdi, hf, &pdecab->fdic ); file_close( hf ); return ret; }
static void test_FDIIsCabinet(void) { ERF erf; BOOL ret; HFDI hfdi; INT_PTR fd; FDICABINETINFO cabinfo; char temp[] = "temp.txt"; char extract[] = "extract.cab"; create_test_files(); create_cab_file(); hfdi = FDICreate(fdi_alloc, fdi_free, fdi_open, fdi_read, fdi_write, fdi_close, fdi_seek, cpuUNKNOWN, &erf); ok(hfdi != NULL, "Expected non-NULL context\n"); /* native crashes if hfdi or cabinfo are NULL or invalid */ /* invalid file handle */ ZeroMemory(&cabinfo, sizeof(FDICABINETINFO)); SetLastError(0xdeadbeef); ret = FDIIsCabinet(hfdi, -1, &cabinfo); ok(ret == FALSE, "Expected FALSE, got %d\n", ret); ok(GetLastError() == ERROR_INVALID_HANDLE, "Expected ERROR_INVALID_HANDLE, got %d\n", GetLastError()); ok(cabinfo.cbCabinet == 0, "Expected 0, got %d\n", cabinfo.cbCabinet); ok(cabinfo.cFiles == 0, "Expected 0, got %d\n", cabinfo.cFiles); ok(cabinfo.cFolders == 0, "Expected 0, got %d\n", cabinfo.cFolders); ok(cabinfo.iCabinet == 0, "Expected 0, got %d\n", cabinfo.iCabinet); ok(cabinfo.setID == 0, "Expected 0, got %d\n", cabinfo.setID); createTestFile("temp.txt"); fd = fdi_open(temp, 0, 0); /* file handle doesn't point to a cabinet */ ZeroMemory(&cabinfo, sizeof(FDICABINETINFO)); SetLastError(0xdeadbeef); ret = FDIIsCabinet(hfdi, fd, &cabinfo); ok(ret == FALSE, "Expected FALSE, got %d\n", ret); ok(GetLastError() == 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", GetLastError()); ok(cabinfo.cbCabinet == 0, "Expected 0, got %d\n", cabinfo.cbCabinet); ok(cabinfo.cFiles == 0, "Expected 0, got %d\n", cabinfo.cFiles); ok(cabinfo.cFolders == 0, "Expected 0, got %d\n", cabinfo.cFolders); ok(cabinfo.iCabinet == 0, "Expected 0, got %d\n", cabinfo.iCabinet); ok(cabinfo.setID == 0, "Expected 0, got %d\n", cabinfo.setID); fdi_close(fd); DeleteFileA("temp.txt"); /* try a real cab */ fd = fdi_open(extract, 0, 0); ZeroMemory(&cabinfo, sizeof(FDICABINETINFO)); SetLastError(0xdeadbeef); ret = FDIIsCabinet(hfdi, fd, &cabinfo); ok(ret == TRUE, "Expected TRUE, got %d\n", ret); ok(GetLastError() == 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", GetLastError()); ok(cabinfo.cFiles == 4, "Expected 4, got %d\n", cabinfo.cFiles); ok(cabinfo.cFolders == 1, "Expected 1, got %d\n", cabinfo.cFolders); ok(cabinfo.setID == 0xbeef, "Expected 0xbeef, got %d\n", cabinfo.setID); todo_wine { ok(cabinfo.cbCabinet == 182, "Expected 182, got %d\n", cabinfo.cbCabinet); ok(cabinfo.iCabinet == 0, "Expected 0, got %d\n", cabinfo.iCabinet); } fdi_close(fd); FDIDestroy(hfdi); delete_test_files(); }