Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
The following code example demonstrates how to export an image in a .wim file to another .wim file, by using the WIMExportImage function. The WIMExportImage function transfers the data of an image from one .wim file to another.
Example
#include <stdio.h>
#include <windows.h>
#include <wimgapi.h>
//
// Main function:
//
int __cdecl
wmain(DWORD argc, PWSTR argv[])
{
BOOL bRet = TRUE;
HANDLE hSrcWim = NULL,
hDestWim = NULL;
HANDLE hSrcImage = NULL;
DWORD dwCreationResult = 0,
dwImageIndex = 0;
DWORD dwCreateFlags = 0;
DWORD dwError = 0;
PWSTR pszSourceFile = L"C:\\sample_image.wim"; // Source .wim file
PWSTR pszTargetFile = L"C:\\sample_exported.wim"; // Destination .wim file
PWSTR pszTmpDir = L"C:\\tmp"; // Temporary directory: OPTIONAL
WIM_INFO WimInfo = {0};
if ((argc != 2) ||
!(dwImageIndex = _wtoi(argv[1])))
{
wprintf(L"need image Index (1-based)\n");
dwError = ERROR_INVALID_PARAMETER;
bRet = FALSE;
}
// Optionally, if the image was captured with WIM_FLAG_VERIFY,
// you can use whole-file verification. Whole-file
// verification performs extra hashing checks and generates extra hashes.
// It detects file corruption due to a bad disk or a
// faulty network connection, but it adds time to the operation due to
// extra I/O operations and extra hash checks.
// To enable whole-file verification, use:
//
// dwCreateFlags |= WIM_FLAG_VERIFY;
// Open source .wim file
//
if (bRet)
{
hSrcWim = WIMCreateFile(pszSourceFile,
WIM_GENERIC_READ,
WIM_OPEN_EXISTING,
dwCreateFlags,
0,
&dwCreationResult);
if (!hSrcWim)
{
dwError = GetLastError();
bRet = FALSE;
wprintf(L"Cannot open src WIM file\n");
}
}
//
// Note: To attach split .wim files (SWM) to this session, use:
// WIMSetReferenceFile(hSrcWim, pszFileName, dwFlags)
//
if (bRet)
{
bRet = WIMGetAttributes(hSrcWim, &WimInfo, sizeof(WimInfo));
if (!bRet)
{
dwError = GetLastError();
wprintf(L"Cannot get WIM attr\n");
}
}
if (bRet)
{
wprintf(L"\nWIM path: %s\n", WimInfo.WimPath);
wprintf(L" image #: %d\n", WimInfo.ImageCount);
wprintf(L" comp. : %s\n", (WimInfo.CompressionType == WIM_COMPRESS_NONE)?"NO":"YES");
wprintf(L" part #: %d / %d\n\n", WimInfo.PartNumber, WimInfo.TotalParts);
}
// Image index and Image count are both 1-based integers.
//
if (bRet && dwImageIndex > WIMGetImageCount(hSrcWim))
{
dwError = ERROR_INVALID_PARAMETER;
bRet = FALSE;
wprintf(L"cannot find image index %d in src WIM file\n", dwImageIndex);
}
// Try to open the destination .wim file.
//
if (bRet)
{
DWORD dwTargetCompressionType = 0;
dwTargetCompressionType = WIM_COMPRESS_XPRESS;
hDestWim = WIMCreateFile(pszTargetFile,
WIM_GENERIC_WRITE | WIM_GENERIC_READ,
WIM_OPEN_ALWAYS,
dwCreateFlags,
dwTargetCompressionType,
&dwCreationResult);
if (!hDestWim)
{
dwError = GetLastError();
bRet = FALSE;
wprintf(L"Cannot open target WIM file\n");
}
}
// Set a temporary working directory.
//
if (bRet)
{
bRet = (WIMSetTemporaryPath(hSrcWim, pszTmpDir) &&
WIMSetTemporaryPath(hDestWim, pszTmpDir));
if (!bRet)
{
dwError = GetLastError();
wprintf(L"Cannot set temporary path\n");
}
}
// Capture or append an image.
//
if (bRet)
{
hSrcImage = WIMLoadImage(hSrcWim, dwImageIndex);
if (!hSrcImage)
{
dwError = GetLastError();
bRet = FALSE;
wprintf(L"Cannot load imagex %d from src WIM file\n", dwImageIndex);
}
}
if (bRet)
{
DWORD dwExportFlags = 0;
// Example export flags:
// dwExportFlags |= WIM_EXPORT_ALLOW_DUPLICATES;
//
// Note: For progress reporting, you can use WIMRegisterMessageCallback. For more information,
// see the Apply an Image from a .wim file code sample.
//
bRet = WIMExportImage(hSrcImage, hDestWim, dwExportFlags);
if (!bRet)
{
dwError = GetLastError();
wprintf(L"Export failed\n");
if (dwError == ERROR_ALREADY_EXISTS)
{
wprintf(L"the same image already exist in the destination .wim file\n");
// You can use WIM_EXPORT_ALLOW_DUPLICATES if you do not want to block duplicate images
// from being added to a single .wim file.
}
}
}
// When you are finished, close the handles that you created in the previous steps..
//
if (hSrcImage) WIMCloseHandle(hSrcImage);
if (hSrcWim) WIMCloseHandle(hSrcWim);
if (hDestWim) WIMCloseHandle(hDestWim);
wprintf(L"Returning status: 0x%x\n", dwError);
return dwError;
}