Gary Spencer 927c58f048 Added custom I/O control support to the CIFS server to support the client
side Windows application to expose repo specific functions such as check in/out.

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@2058 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
2005-12-22 15:04:54 +00:00

243 lines
10 KiB
Java

/*
* Copyright (C) 2005 Alfresco, Inc.
*
* Licensed under the Mozilla Public License version 1.1
* with a permitted attribution clause. You may obtain a
* copy of the License at
*
* http://www.alfresco.org/legal/license.txt
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* either express or implied. See the License for the specific
* language governing permissions and limitations under the
* License.
*/
package org.alfresco.filesys.smb;
/**
* NT IO Control Codes Class
*/
public class NTIOCtl
{
// Device type codes
public static final int DeviceBeep = 0x0001;
public static final int DeviceCDRom = 0x0002;
public static final int DeviceCDRomFileSystem = 0x0003;
public static final int DeviceController = 0x0004;
public static final int DeviceDataLink = 0x0005;
public static final int DeviceDFS = 0x0006;
public static final int DeviceDisk = 0x0007;
public static final int DeviceDiskFileSystem = 0x0008;
public static final int DeviceFileSystem = 0x0009;
public static final int DeviceInportPort = 0x000A;
public static final int DeviceKeyboard = 0x000B;
public static final int DeviceMailSlot = 0x000C;
public static final int DeviceMidiIn = 0x000D;
public static final int DeviceMidiOut = 0x000E;
public static final int DeviceMouse = 0x000F;
public static final int DeviceMultiUNCProvider = 0x0010;
public static final int DeviceNamedPipe = 0x0011;
public static final int DeviceNetwork = 0x0012;
public static final int DeviceNetworkBrowser = 0x0013;
public static final int DeviceNetworkFileSystem = 0x0014;
public static final int DeviceNull = 0x0015;
public static final int DeviceParallelPort = 0x0016;
public static final int DevicePhysicalNetCard = 0x0017;
public static final int DevicePrinter = 0x0018;
public static final int DeviceScanner = 0x0019;
public static final int DeviceSerialMousePort = 0x001A;
public static final int DeviceSerialPort = 0x001B;
public static final int DeviceScreen = 0x001C;
public static final int DeviceSound = 0x001D;
public static final int DeviceStreams = 0x001E;
public static final int DeviceTape = 0x001F;
public static final int DeviceTapeFileSystem = 0x0020;
public static final int DeviceTransport = 0x0021;
public static final int DeviceUnknown = 0x0022;
public static final int DeviceVideo = 0x0023;
public static final int DeviceVirtualDisk = 0x0024;
public static final int DeviceWaveIn = 0x0025;
public static final int DeviceWaveOut = 0x0026;
public static final int Device8042Port = 0x0027;
public static final int DeviceNetworkRedirector = 0x0028;
public static final int DeviceBattery = 0x0029;
public static final int DeviceBusExtender = 0x002A;
public static final int DeviceModem = 0x002B;
public static final int DeviceVDM = 0x002C;
public static final int DeviceMassStorage = 0x002D;
public static final int DeviceSMB = 0x002E;
public static final int DeviceKS = 0x002F;
public static final int DeviceChanger = 0x0030;
public static final int DeviceSmartCard = 0x0031;
public static final int DeviceACPI = 0x0032;
public static final int DeviceDVD = 0x0033;
public static final int DeviceFullScreenVideo = 0x0034;
public static final int DeviceDFSFileSystem = 0x0035;
public static final int DeviceDFSVolume = 0x0036;
// Method types for I/O and filesystem controls
public static final int MethodBuffered = 0;
public static final int MethodInDirect = 1;
public static final int MethodOutDirect = 2;
public static final int MethodNeither = 3;
// Access check types
public static final int AccessAny = 0;
public static final int AccessRead = 0x0001;
public static final int AccessWrite = 0x0002;
// Filesystem function codes
public static final int FsCtlRequestOplockLevel1 = 0;
public static final int FsCtlRequestOplockLevel2 = 1;
public static final int FsCtlRequestBatchOplock = 2;
public static final int FsCtlOplockBreakAck = 3;
public static final int FsCtlOpBatchAckClosePend = 4;
public static final int FsCtlOplockBreakNotify = 5;
public static final int FsCtlLockVolume = 6;
public static final int FsCtlUnlockVolume = 7;
public static final int FsCtlDismountVolume = 8;
public static final int FsCtlIsVolumeMounted = 10;
public static final int FsCtlIsPathnameValid = 11;
public static final int FsCtlMarkVolumeDirty = 12;
public static final int FsCtlQueryRetrievalPtrs = 14;
public static final int FsCtlGetCompression = 15;
public static final int FsCtlSetCompression = 16;
public static final int FsCtlMarkAsSystemHive = 19;
public static final int FsCtlOplockBreakAck2 = 20;
public static final int FsCtlInvalidateVolumes = 21;
public static final int FsCtlQueryFatBPB = 22;
public static final int FsCtlRequestFilterOplock = 23;
public static final int FsCtlFileSysGetStats = 24;
public static final int FsCtlGetNTFSVolumeData = 25;
public static final int FsCtlGetNTFSFileRecord = 26;
public static final int FsCtlGetVolumeBitmap = 27;
public static final int FsCtlGetRetrievalPtrs = 28;
public static final int FsCtlMoveFile = 29;
public static final int FsCtlIsVolumeDirty = 30;
public static final int FsCtlGetHFSInfo = 31;
public static final int FsCtlAllowExtenDasdIO = 32;
public static final int FsCtlReadPropertyData = 33;
public static final int FsCtlWritePropertyData = 34;
public static final int FsCtlFindFilesBySID = 35;
public static final int FsCtlDumpPropertyData = 37;
public static final int FsCtlSetObjectId = 38;
public static final int FsCtlGetObjectId = 39;
public static final int FsCtlDeleteObjectId = 40;
public static final int FsCtlSetReparsePoint = 41;
public static final int FsCtlGetReparsePoint = 42;
public static final int FsCtlDeleteReparsePoint = 43;
public static final int FsCtlEnumUsnData = 44;
public static final int FsCtlSecurityIdCheck = 45;
public static final int FsCtlReadUsnJournal = 46;
public static final int FsCtlSetObjectIdExtended = 47;
public static final int FsCtlCreateOrGetObjectId = 48;
public static final int FsCtlSetSparse = 49;
public static final int FsCtlSetZeroData = 50;
public static final int FsCtlQueryAllocRanges = 51;
public static final int FsCtlEnableUpgrade = 52;
public static final int FsCtlSetEncryption = 53;
public static final int FsCtlEncryptionFsCtlIO = 54;
public static final int FsCtlWriteRawEncrypted = 55;
public static final int FsCtlReadRawEncrypted = 56;
public static final int FsCtlCreateUsnJournal = 57;
public static final int FsCtlReadFileUsnData = 58;
public static final int FsCtlWriteUsnCloseRecord = 59;
public static final int FsCtlExtendVolume = 60;
// Base value for custom control codes
public static final int FsCtlCustom = 0x800;
/**
* Extract the device type from an I/O control code
*
* @param ioctl int
* @return int
*/
public final static int getDeviceType(int ioctl)
{
return (ioctl >> 16) & 0x0000FFFF;
}
/**
* Extract the access type from an I/O control code
*
* @param ioctl int
* @return int
*/
public final static int getAccessType(int ioctl)
{
return (ioctl >> 14) & 0x00000003;
}
/**
* Extract the function code from the I/O control code
*
* @param ioctl int
* @return int
*/
public final static int getFunctionCode(int ioctl)
{
return (ioctl >> 2) & 0x00000FFF;
}
/**
* Extract the method code from the I/O control code
*
* @param ioctl int
* @return int
*/
public final static int getMethod(int ioctl)
{
return ioctl & 0x00000003;
}
/**
* Make a control code
*
* @param devType int
* @param func int
* @param method int
* @param access int
* @return int
*/
public final static int makeControlCode(int devType, int func, int method, int access)
{
return (devType << 16) + (access << 14) + (func << 2) + (method);
}
/**
* Return an I/O control code as a string
*
* @param ioctl int
* @return String
*/
public final static String asString(int ioctl)
{
StringBuffer str = new StringBuffer();
str.append("[Func:");
str.append(getFunctionCode(ioctl));
str.append(",DevType:");
str.append(getDeviceType(ioctl));
str.append(",Access:");
str.append(getAccessType(ioctl));
str.append(",Method:");
str.append(getMethod(ioctl));
str.append("]");
return str.toString();
}
}