You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
176 lines
5.1 KiB
176 lines
5.1 KiB
/*
|
|
* WORKUTIL.C
|
|
*
|
|
* RSM Service : Utilities for servicing work items
|
|
*
|
|
* Author: ErvinP
|
|
*
|
|
* (c) 2001 Microsoft Corporation
|
|
*
|
|
*/
|
|
|
|
|
|
#include <windows.h>
|
|
#include <stdlib.h>
|
|
#include <wtypes.h>
|
|
|
|
#include <ntmsapi.h>
|
|
#include "..\..\..\rsm\tools\reskit\rsm_config\winioctl.h"
|
|
#include "internal.h"
|
|
#include "resource.h"
|
|
#include "debug.h"
|
|
|
|
|
|
BOOL SendIoctlSync( HANDLE hDevice,
|
|
DWORD dwIoControlCode,
|
|
LPVOID lpInBuffer,
|
|
DWORD nInBufferSize,
|
|
LPVOID lpOutBuffer,
|
|
DWORD nOutBufferSize,
|
|
LPDWORD lpBytesReturned,
|
|
DWORD timeoutMillisec)
|
|
{
|
|
DWORD status;
|
|
DWORD startTime;
|
|
|
|
startTime = GetTickCount();
|
|
|
|
do
|
|
{
|
|
BOOL ok;
|
|
|
|
ok = DeviceIoControl(hDevice,
|
|
dwIoControlCode,
|
|
lpInBuffer,
|
|
nInBufferSize,
|
|
lpOutBuffer,
|
|
nOutBufferSize,
|
|
lpBytesReturned,
|
|
NULL);
|
|
if (ok){
|
|
status = NO_ERROR;
|
|
break;
|
|
}
|
|
else {
|
|
BOOL done;
|
|
|
|
// BUGBUG - check for shutdown
|
|
|
|
status = GetLastError();
|
|
|
|
switch (status){
|
|
case ERROR_NOT_READY:
|
|
case ERROR_DRIVE_LOCKED:
|
|
case ERROR_BUSY_DRIVE:
|
|
case ERROR_BUSY:
|
|
Sleep(3000);
|
|
done = FALSE;
|
|
break;
|
|
default:
|
|
done = TRUE;
|
|
break;
|
|
}
|
|
|
|
if (!done){
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
while (GetTickCount() - startTime < timeoutMillisec);
|
|
|
|
return status;
|
|
}
|
|
|
|
|
|
DWORD ChangerMoveMedium(HANDLE libHandle,
|
|
DWORD TrnsElementOffset,
|
|
ELEMENT_TYPE SrcElementType,
|
|
DWORD SrcElementOffset,
|
|
ELEMENT_TYPE DstElementType,
|
|
DWORD DstElementOffset,
|
|
BOOLEAN Flip,
|
|
ULONG Timeout, // NOT USED
|
|
DWORD timeoutval)
|
|
{
|
|
DWORD status;
|
|
DWORD byteCount = 0;
|
|
CHANGER_MOVE_MEDIUM LibMoveMedium;
|
|
|
|
LibMoveMedium.Transport.ElementType = ChangerTransport;
|
|
LibMoveMedium.Transport.ElementAddress = 0;
|
|
LibMoveMedium.Source.ElementType = SrcElementType;
|
|
LibMoveMedium.Source.ElementAddress = SrcElementOffset;
|
|
LibMoveMedium.Destination.ElementType = DstElementType;
|
|
LibMoveMedium.Destination.ElementAddress = DstElementOffset;
|
|
LibMoveMedium.Flip = Flip;
|
|
|
|
status = SendIoctlSync(libHandle,
|
|
IOCTL_CHANGER_MOVE_MEDIUM,
|
|
&LibMoveMedium,
|
|
sizeof(CHANGER_MOVE_MEDIUM),
|
|
NULL,
|
|
0,
|
|
&byteCount,
|
|
timeoutval);
|
|
return status;
|
|
}
|
|
|
|
|
|
DWORD ChangerSetAccess(HANDLE libHandle,
|
|
ELEMENT_TYPE ElementType,
|
|
ULONG ElementOffset,
|
|
ULONG Control,
|
|
DWORD timeoutval)
|
|
{
|
|
DWORD status;
|
|
DWORD byteCount = 0;
|
|
CHANGER_SET_ACCESS libSetSecurity;
|
|
|
|
libSetSecurity.Element.ElementType = ElementType;
|
|
libSetSecurity.Element.ElementAddress = ElementOffset;
|
|
libSetSecurity.Control = Control;
|
|
|
|
status = SendIoctlSync(libHandle,
|
|
IOCTL_CHANGER_SET_ACCESS,
|
|
&libSetSecurity,
|
|
sizeof(CHANGER_SET_ACCESS),
|
|
NULL,
|
|
0,
|
|
&byteCount,
|
|
timeoutval);
|
|
return status;
|
|
}
|
|
|
|
|
|
DWORD ChangerSetPosition(HANDLE libHandle,
|
|
DWORD TrnsElementOffset,
|
|
ELEMENT_TYPE DstElementType,
|
|
DWORD DstElementOffset,
|
|
BOOLEAN Flip,
|
|
ULONG Timeout, // NOT USED
|
|
DWORD timeoutval)
|
|
{
|
|
DWORD status;
|
|
DWORD byteCount = 0;
|
|
CHANGER_SET_POSITION LibSetPosition;
|
|
|
|
LibSetPosition.Transport.ElementType = ChangerTransport;
|
|
LibSetPosition.Transport.ElementAddress = 0;
|
|
LibSetPosition.Destination.ElementType = DstElementType;
|
|
LibSetPosition.Destination.ElementAddress = DstElementOffset;
|
|
LibSetPosition.Flip = Flip;
|
|
|
|
status = SendIoctlSync(libHandle,
|
|
IOCTL_CHANGER_SET_POSITION,
|
|
&LibSetPosition, sizeof(CHANGER_SET_POSITION),
|
|
NULL,
|
|
0,
|
|
&byteCount,
|
|
timeoutval);
|
|
return status;
|
|
|
|
}
|
|
|
|
|
|
|
|
|