Delete an Image from a .wim File
The following code example demonstrates how to delete an image from a .wim file, by using the WIMDeleteImage function. The WIMDeleteImage function removes an image from within a .wim file so it cannot be accessed. However, the file resources are still available for use by the WIMSetReferenceFile function.
Example
#include <stdio.h>
#include <windows.h>
#include <wimgapi.h>
//
// Main Function:
//
int __cdecl
wmain(DWORD argc, PWSTR argv[])
{
HANDLE hWim = NULL;
BOOL bRet = TRUE;
PWSTR pszWimFile = L"C:\\capture.wim"; // Source .wim file
PWSTR pszTmpDir = L"C:\\tmp"; // Temporary directory
DWORD dwCreateFlags = 0;
DWORD dwCreationDisposition = 0;
DWORD dwImageIndex = 0;
DWORD dwError = 0;
WIM_INFO WimInfo = {0};
// An image index number is required to delete the image or to display the image info.
//
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 hash values.
// 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 the WIM.
//
if (bRet)
{
hWim = WIMCreateFile(pszWimFile,
WIM_GENERIC_READ | WIM_GENERIC_WRITE,
WIM_OPEN_EXISTING,
dwCreateFlags,
0,
&dwCreationDisposition);
if (!hWim)
{
dwError = GetLastError();
bRet = FALSE;
wprintf(L"Cannot open WIM file\n");
}
}
if (bRet)
{
bRet = WIMGetAttributes(hWim, &WimInfo, sizeof(WimInfo));
if (!bRet)
{
dwError = GetLastError();
wprintf(L"WIMGetAttributes failed\n");
}
}
if (bRet && WimInfo.ImageCount < 2)
{
dwError = ERROR_INVALID_PARAMETER;
bRet = FALSE;
wprintf(L"Only one image in the .wim file. Cannot delete it\n");
}
if (bRet && WimInfo.ImageCount < dwImageIndex)
{
dwError = ERROR_INVALID_PARAMETER;
bRet = FALSE;
wprintf(L"There is no image # %d in the WIM file\n", dwImageIndex);
}
// Set a temporary working directory.
//
if (bRet)
{
bRet = WIMSetTemporaryPath(hWim, pszTmpDir);
if (!bRet)
{
dwError = GetLastError();
wprintf(L"cannot set temp path to work in\n");
}
}
// Delete the image.
//
if (bRet)
{
bRet = WIMDeleteImage(hWim, dwImageIndex);
if (!bRet)
{
dwError = GetLastError();
wprintf(L"deleting image failed\n");
}
}
// When you are finished, close the handle that you created in the previous steps.
//
if (hWim)
{
WIMCloseHandle(hWim);
}
wprintf(L"Returning status: 0x%x\n", dwError);
return dwError;
}