Leaked source code of windows server 2003
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

/*
* 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;
}