Path: blob/aarch64-shenandoah-jdk8u272-b10/jdk/src/windows/native/sun/nio/fs/WindowsNativeDispatcher.c
32288 views
/*1* Copyright (c) 2008, 2018, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation. Oracle designates this7* particular file as subject to the "Classpath" exception as provided8* by Oracle in the LICENSE file that accompanied this code.9*10* This code is distributed in the hope that it will be useful, but WITHOUT11* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or12* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License13* version 2 for more details (a copy is included in the LICENSE file that14* accompanied this code).15*16* You should have received a copy of the GNU General Public License version17* 2 along with this work; if not, write to the Free Software Foundation,18* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.19*20* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA21* or visit www.oracle.com if you need additional information or have any22* questions.23*/2425#ifndef _WIN32_WINNT26#define _WIN32_WINNT 0x050127#endif2829#include <stdio.h>30#include <stdlib.h>31#include <ctype.h>32#include <direct.h>33#include <malloc.h>34#include <io.h>35#include <windows.h>36#include <aclapi.h>37#include <winioctl.h>38#include <Sddl.h>3940#include "jni.h"41#include "jni_util.h"42#include "jlong.h"4344#include "sun_nio_fs_WindowsNativeDispatcher.h"4546/**47* jfieldIDs48*/49static jfieldID findFirst_handle;50static jfieldID findFirst_name;51static jfieldID findFirst_attributes;5253static jfieldID findStream_handle;54static jfieldID findStream_name;5556static jfieldID volumeInfo_fsName;57static jfieldID volumeInfo_volName;58static jfieldID volumeInfo_volSN;59static jfieldID volumeInfo_flags;6061static jfieldID diskSpace_bytesAvailable;62static jfieldID diskSpace_totalBytes;63static jfieldID diskSpace_totalFree;6465static jfieldID account_domain;66static jfieldID account_name;67static jfieldID account_use;6869static jfieldID aclInfo_aceCount;7071static jfieldID completionStatus_error;72static jfieldID completionStatus_bytesTransferred;73static jfieldID completionStatus_completionKey;7475static jfieldID backupResult_bytesTransferred;76static jfieldID backupResult_context;777879/**80* Win32 APIs not available in Windows XP81*/82typedef HANDLE (WINAPI* FindFirstStream_Proc)(LPCWSTR, STREAM_INFO_LEVELS, LPVOID, DWORD);83typedef BOOL (WINAPI* FindNextStream_Proc)(HANDLE, LPVOID);8485typedef BOOLEAN (WINAPI* CreateSymbolicLinkProc) (LPCWSTR, LPCWSTR, DWORD);86typedef BOOL (WINAPI* GetFinalPathNameByHandleProc) (HANDLE, LPWSTR, DWORD, DWORD);8788static FindFirstStream_Proc FindFirstStream_func;89static FindNextStream_Proc FindNextStream_func;9091static CreateSymbolicLinkProc CreateSymbolicLink_func;92static GetFinalPathNameByHandleProc GetFinalPathNameByHandle_func;9394static void throwWindowsException(JNIEnv* env, DWORD lastError) {95jobject x = JNU_NewObjectByName(env, "sun/nio/fs/WindowsException",96"(I)V", lastError);97if (x != NULL) {98(*env)->Throw(env, x);99}100}101102/**103* Initializes jfieldIDs and get address of Win32 calls that are located104* at runtime.105*/106JNIEXPORT void JNICALL107Java_sun_nio_fs_WindowsNativeDispatcher_initIDs(JNIEnv* env, jclass this)108{109jclass clazz;110HMODULE h;111112clazz = (*env)->FindClass(env, "sun/nio/fs/WindowsNativeDispatcher$FirstFile");113CHECK_NULL(clazz);114findFirst_handle = (*env)->GetFieldID(env, clazz, "handle", "J");115CHECK_NULL(findFirst_handle);116findFirst_name = (*env)->GetFieldID(env, clazz, "name", "Ljava/lang/String;");117CHECK_NULL(findFirst_name);118findFirst_attributes = (*env)->GetFieldID(env, clazz, "attributes", "I");119CHECK_NULL(findFirst_attributes);120121clazz = (*env)->FindClass(env, "sun/nio/fs/WindowsNativeDispatcher$FirstStream");122CHECK_NULL(clazz);123findStream_handle = (*env)->GetFieldID(env, clazz, "handle", "J");124CHECK_NULL(findStream_handle);125findStream_name = (*env)->GetFieldID(env, clazz, "name", "Ljava/lang/String;");126CHECK_NULL(findStream_name);127128clazz = (*env)->FindClass(env, "sun/nio/fs/WindowsNativeDispatcher$VolumeInformation");129CHECK_NULL(clazz);130volumeInfo_fsName = (*env)->GetFieldID(env, clazz, "fileSystemName", "Ljava/lang/String;");131CHECK_NULL(volumeInfo_fsName);132volumeInfo_volName = (*env)->GetFieldID(env, clazz, "volumeName", "Ljava/lang/String;");133CHECK_NULL(volumeInfo_volName);134volumeInfo_volSN = (*env)->GetFieldID(env, clazz, "volumeSerialNumber", "I");135CHECK_NULL(volumeInfo_volSN);136volumeInfo_flags = (*env)->GetFieldID(env, clazz, "flags", "I");137CHECK_NULL(volumeInfo_flags);138139clazz = (*env)->FindClass(env, "sun/nio/fs/WindowsNativeDispatcher$DiskFreeSpace");140CHECK_NULL(clazz);141diskSpace_bytesAvailable = (*env)->GetFieldID(env, clazz, "freeBytesAvailable", "J");142CHECK_NULL(diskSpace_bytesAvailable);143diskSpace_totalBytes = (*env)->GetFieldID(env, clazz, "totalNumberOfBytes", "J");144CHECK_NULL(diskSpace_totalBytes);145diskSpace_totalFree = (*env)->GetFieldID(env, clazz, "totalNumberOfFreeBytes", "J");146CHECK_NULL(diskSpace_totalFree);147148clazz = (*env)->FindClass(env, "sun/nio/fs/WindowsNativeDispatcher$Account");149CHECK_NULL(clazz);150account_domain = (*env)->GetFieldID(env, clazz, "domain", "Ljava/lang/String;");151CHECK_NULL(account_domain);152account_name = (*env)->GetFieldID(env, clazz, "name", "Ljava/lang/String;");153CHECK_NULL(account_name);154account_use = (*env)->GetFieldID(env, clazz, "use", "I");155CHECK_NULL(account_use);156157clazz = (*env)->FindClass(env, "sun/nio/fs/WindowsNativeDispatcher$AclInformation");158CHECK_NULL(clazz);159aclInfo_aceCount = (*env)->GetFieldID(env, clazz, "aceCount", "I");160CHECK_NULL(aclInfo_aceCount);161162clazz = (*env)->FindClass(env, "sun/nio/fs/WindowsNativeDispatcher$CompletionStatus");163CHECK_NULL(clazz);164completionStatus_error = (*env)->GetFieldID(env, clazz, "error", "I");165CHECK_NULL(completionStatus_error);166completionStatus_bytesTransferred = (*env)->GetFieldID(env, clazz, "bytesTransferred", "I");167CHECK_NULL(completionStatus_bytesTransferred);168completionStatus_completionKey = (*env)->GetFieldID(env, clazz, "completionKey", "J");169CHECK_NULL(completionStatus_completionKey);170171clazz = (*env)->FindClass(env, "sun/nio/fs/WindowsNativeDispatcher$BackupResult");172CHECK_NULL(clazz);173backupResult_bytesTransferred = (*env)->GetFieldID(env, clazz, "bytesTransferred", "I");174CHECK_NULL(backupResult_bytesTransferred);175backupResult_context = (*env)->GetFieldID(env, clazz, "context", "J");176CHECK_NULL(backupResult_context);177178// get handle to kernel32179if (GetModuleHandleExW((GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS |180GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT),181(LPCWSTR)&CreateFileW, &h) != 0)182{183// requires Windows Server 2003 or newer184FindFirstStream_func =185(FindFirstStream_Proc)GetProcAddress(h, "FindFirstStreamW");186FindNextStream_func =187(FindNextStream_Proc)GetProcAddress(h, "FindNextStreamW");188189// requires Windows Vista or newer190CreateSymbolicLink_func =191(CreateSymbolicLinkProc)GetProcAddress(h, "CreateSymbolicLinkW");192GetFinalPathNameByHandle_func =193(GetFinalPathNameByHandleProc)GetProcAddress(h, "GetFinalPathNameByHandleW");194}195}196197JNIEXPORT jlong JNICALL198Java_sun_nio_fs_WindowsNativeDispatcher_CreateEvent(JNIEnv* env, jclass this,199jboolean bManualReset, jboolean bInitialState)200{201HANDLE hEvent = CreateEventW(NULL, bManualReset, bInitialState, NULL);202if (hEvent == NULL) {203throwWindowsException(env, GetLastError());204}205return ptr_to_jlong(hEvent);206}207208JNIEXPORT jstring JNICALL209Java_sun_nio_fs_WindowsNativeDispatcher_FormatMessage(JNIEnv* env, jclass this, jint errorCode) {210WCHAR message[255];211212DWORD len = FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM,213NULL,214(DWORD)errorCode,2150,216&message[0],217255,218NULL);219220221if (len == 0) {222return NULL;223} else {224return (*env)->NewString(env, (const jchar *)message, (jsize)wcslen(message));225}226}227228JNIEXPORT void JNICALL229Java_sun_nio_fs_WindowsNativeDispatcher_LocalFree(JNIEnv* env, jclass this, jlong address)230{231HLOCAL hMem = (HLOCAL)jlong_to_ptr(address);232LocalFree(hMem);233}234235JNIEXPORT jlong JNICALL236Java_sun_nio_fs_WindowsNativeDispatcher_CreateFile0(JNIEnv* env, jclass this,237jlong address, jint dwDesiredAccess, jint dwShareMode, jlong sdAddress,238jint dwCreationDisposition, jint dwFlagsAndAttributes)239{240HANDLE handle;241LPCWSTR lpFileName = jlong_to_ptr(address);242243SECURITY_ATTRIBUTES securityAttributes;244LPSECURITY_ATTRIBUTES lpSecurityAttributes;245PSECURITY_DESCRIPTOR lpSecurityDescriptor = jlong_to_ptr(sdAddress);246247248if (lpSecurityDescriptor == NULL) {249lpSecurityAttributes = NULL;250} else {251securityAttributes.nLength = sizeof(SECURITY_ATTRIBUTES);252securityAttributes.lpSecurityDescriptor = lpSecurityDescriptor;253securityAttributes.bInheritHandle = FALSE;254lpSecurityAttributes = &securityAttributes;255}256257handle = CreateFileW(lpFileName,258(DWORD)dwDesiredAccess,259(DWORD)dwShareMode,260lpSecurityAttributes,261(DWORD)dwCreationDisposition,262(DWORD)dwFlagsAndAttributes,263NULL);264if (handle == INVALID_HANDLE_VALUE) {265throwWindowsException(env, GetLastError());266}267return ptr_to_jlong(handle);268}269270271JNIEXPORT void JNICALL272Java_sun_nio_fs_WindowsNativeDispatcher_DeviceIoControlSetSparse(JNIEnv* env, jclass this,273jlong handle)274{275DWORD bytesReturned;276HANDLE h = (HANDLE)jlong_to_ptr(handle);277if (DeviceIoControl(h, FSCTL_SET_SPARSE, NULL, 0, NULL, 0, &bytesReturned, NULL) == 0) {278throwWindowsException(env, GetLastError());279}280}281282JNIEXPORT void JNICALL283Java_sun_nio_fs_WindowsNativeDispatcher_DeviceIoControlGetReparsePoint(JNIEnv* env, jclass this,284jlong handle, jlong bufferAddress, jint bufferSize)285{286DWORD bytesReturned;287HANDLE h = (HANDLE)jlong_to_ptr(handle);288LPVOID outBuffer = (LPVOID)jlong_to_ptr(bufferAddress);289290if (DeviceIoControl(h, FSCTL_GET_REPARSE_POINT, NULL, 0, outBuffer, (DWORD)bufferSize,291&bytesReturned, NULL) == 0)292{293throwWindowsException(env, GetLastError());294}295}296297JNIEXPORT void JNICALL298Java_sun_nio_fs_WindowsNativeDispatcher_DeleteFile0(JNIEnv* env, jclass this, jlong address)299{300LPCWSTR lpFileName = jlong_to_ptr(address);301if (DeleteFileW(lpFileName) == 0) {302throwWindowsException(env, GetLastError());303}304}305306JNIEXPORT void JNICALL307Java_sun_nio_fs_WindowsNativeDispatcher_CreateDirectory0(JNIEnv* env, jclass this,308jlong address, jlong sdAddress)309{310LPCWSTR lpFileName = jlong_to_ptr(address);311312SECURITY_ATTRIBUTES securityAttributes;313LPSECURITY_ATTRIBUTES lpSecurityAttributes;314PSECURITY_DESCRIPTOR lpSecurityDescriptor = jlong_to_ptr(sdAddress);315316317if (lpSecurityDescriptor == NULL) {318lpSecurityAttributes = NULL;319} else {320securityAttributes.nLength = sizeof(SECURITY_ATTRIBUTES);321securityAttributes.lpSecurityDescriptor = lpSecurityDescriptor;322securityAttributes.bInheritHandle = FALSE;323lpSecurityAttributes = &securityAttributes;324}325326if (CreateDirectoryW(lpFileName, lpSecurityAttributes) == 0) {327throwWindowsException(env, GetLastError());328}329}330331JNIEXPORT void JNICALL332Java_sun_nio_fs_WindowsNativeDispatcher_RemoveDirectory0(JNIEnv* env, jclass this, jlong address)333{334LPCWSTR lpFileName = jlong_to_ptr(address);335if (RemoveDirectoryW(lpFileName) == 0) {336throwWindowsException(env, GetLastError());337}338}339340JNIEXPORT void JNICALL341Java_sun_nio_fs_WindowsNativeDispatcher_CloseHandle(JNIEnv* env, jclass this,342jlong handle)343{344HANDLE h = (HANDLE)jlong_to_ptr(handle);345CloseHandle(h);346}347348JNIEXPORT void JNICALL349Java_sun_nio_fs_WindowsNativeDispatcher_FindFirstFile0(JNIEnv* env, jclass this,350jlong address, jobject obj)351{352WIN32_FIND_DATAW data;353LPCWSTR lpFileName = jlong_to_ptr(address);354355HANDLE handle = FindFirstFileW(lpFileName, &data);356if (handle != INVALID_HANDLE_VALUE) {357jstring name = (*env)->NewString(env, data.cFileName, (jsize)wcslen(data.cFileName));358if (name == NULL)359return;360(*env)->SetLongField(env, obj, findFirst_handle, ptr_to_jlong(handle));361(*env)->SetObjectField(env, obj, findFirst_name, name);362(*env)->SetIntField(env, obj, findFirst_attributes, data.dwFileAttributes);363} else {364throwWindowsException(env, GetLastError());365}366}367368JNIEXPORT jlong JNICALL369Java_sun_nio_fs_WindowsNativeDispatcher_FindFirstFile1(JNIEnv* env, jclass this,370jlong pathAddress, jlong dataAddress)371{372LPCWSTR lpFileName = jlong_to_ptr(pathAddress);373WIN32_FIND_DATAW* data = (WIN32_FIND_DATAW*)jlong_to_ptr(dataAddress);374375HANDLE handle = FindFirstFileW(lpFileName, data);376if (handle == INVALID_HANDLE_VALUE) {377throwWindowsException(env, GetLastError());378}379return ptr_to_jlong(handle);380}381382JNIEXPORT jstring JNICALL383Java_sun_nio_fs_WindowsNativeDispatcher_FindNextFile(JNIEnv* env, jclass this,384jlong handle, jlong dataAddress)385{386HANDLE h = (HANDLE)jlong_to_ptr(handle);387WIN32_FIND_DATAW* data = (WIN32_FIND_DATAW*)jlong_to_ptr(dataAddress);388389if (FindNextFileW(h, data) != 0) {390return (*env)->NewString(env, data->cFileName, (jsize)wcslen(data->cFileName));391} else {392if (GetLastError() != ERROR_NO_MORE_FILES)393throwWindowsException(env, GetLastError());394return NULL;395}396}397398JNIEXPORT void JNICALL399Java_sun_nio_fs_WindowsNativeDispatcher_FindFirstStream0(JNIEnv* env, jclass this,400jlong address, jobject obj)401{402WIN32_FIND_STREAM_DATA data;403LPCWSTR lpFileName = jlong_to_ptr(address);404HANDLE handle;405406if (FindFirstStream_func == NULL) {407JNU_ThrowInternalError(env, "Should not get here");408return;409}410411handle = (*FindFirstStream_func)(lpFileName, FindStreamInfoStandard, &data, 0);412if (handle != INVALID_HANDLE_VALUE) {413jstring name = (*env)->NewString(env, data.cStreamName, (jsize)wcslen(data.cStreamName));414if (name == NULL)415return;416(*env)->SetLongField(env, obj, findStream_handle, ptr_to_jlong(handle));417(*env)->SetObjectField(env, obj, findStream_name, name);418} else {419if (GetLastError() == ERROR_HANDLE_EOF) {420(*env)->SetLongField(env, obj, findStream_handle, ptr_to_jlong(handle));421} else {422throwWindowsException(env, GetLastError());423}424}425426}427428JNIEXPORT jstring JNICALL429Java_sun_nio_fs_WindowsNativeDispatcher_FindNextStream(JNIEnv* env, jclass this,430jlong handle)431{432WIN32_FIND_STREAM_DATA data;433HANDLE h = (HANDLE)jlong_to_ptr(handle);434435if (FindNextStream_func == NULL) {436JNU_ThrowInternalError(env, "Should not get here");437return NULL;438}439440if ((*FindNextStream_func)(h, &data) != 0) {441return (*env)->NewString(env, data.cStreamName, (jsize)wcslen(data.cStreamName));442} else {443if (GetLastError() != ERROR_HANDLE_EOF)444throwWindowsException(env, GetLastError());445return NULL;446}447}448449450JNIEXPORT void JNICALL451Java_sun_nio_fs_WindowsNativeDispatcher_FindClose(JNIEnv* env, jclass this,452jlong handle)453{454HANDLE h = (HANDLE)jlong_to_ptr(handle);455if (FindClose(h) == 0) {456throwWindowsException(env, GetLastError());457}458}459460461JNIEXPORT void JNICALL462Java_sun_nio_fs_WindowsNativeDispatcher_GetFileInformationByHandle(JNIEnv* env, jclass this,463jlong handle, jlong address)464{465HANDLE h = (HANDLE)jlong_to_ptr(handle);466BY_HANDLE_FILE_INFORMATION* info =467(BY_HANDLE_FILE_INFORMATION*)jlong_to_ptr(address);468if (GetFileInformationByHandle(h, info) == 0) {469throwWindowsException(env, GetLastError());470}471}472473474JNIEXPORT void JNICALL475Java_sun_nio_fs_WindowsNativeDispatcher_CopyFileEx0(JNIEnv* env, jclass this,476jlong existingAddress, jlong newAddress, jint flags, jlong cancelAddress)477{478LPCWSTR lpExistingFileName = jlong_to_ptr(existingAddress);479LPCWSTR lpNewFileName = jlong_to_ptr(newAddress);480LPBOOL cancel = (LPBOOL)jlong_to_ptr(cancelAddress);481if (CopyFileExW(lpExistingFileName, lpNewFileName, NULL, NULL, cancel,482(DWORD)flags) == 0)483{484throwWindowsException(env, GetLastError());485}486}487488JNIEXPORT void JNICALL489Java_sun_nio_fs_WindowsNativeDispatcher_MoveFileEx0(JNIEnv* env, jclass this,490jlong existingAddress, jlong newAddress, jint flags)491{492LPCWSTR lpExistingFileName = jlong_to_ptr(existingAddress);493LPCWSTR lpNewFileName = jlong_to_ptr(newAddress);494if (MoveFileExW(lpExistingFileName, lpNewFileName, (DWORD)flags) == 0) {495throwWindowsException(env, GetLastError());496}497}498499JNIEXPORT jint JNICALL500Java_sun_nio_fs_WindowsNativeDispatcher_GetLogicalDrives(JNIEnv* env, jclass this)501{502DWORD res = GetLogicalDrives();503if (res == 0) {504throwWindowsException(env, GetLastError());505}506return (jint)res;507}508509JNIEXPORT jint JNICALL510Java_sun_nio_fs_WindowsNativeDispatcher_GetFileAttributes0(JNIEnv* env, jclass this,511jlong address)512{513LPCWSTR lpFileName = jlong_to_ptr(address);514DWORD value = GetFileAttributesW(lpFileName);515516if (value == INVALID_FILE_ATTRIBUTES) {517throwWindowsException(env, GetLastError());518}519return (jint)value;520}521522JNIEXPORT void JNICALL523Java_sun_nio_fs_WindowsNativeDispatcher_SetFileAttributes0(JNIEnv* env, jclass this,524jlong address, jint value)525{526LPCWSTR lpFileName = jlong_to_ptr(address);527if (SetFileAttributesW(lpFileName, (DWORD)value) == 0) {528throwWindowsException(env, GetLastError());529}530}531532JNIEXPORT void JNICALL533Java_sun_nio_fs_WindowsNativeDispatcher_GetFileAttributesEx0(JNIEnv* env, jclass this,534jlong pathAddress, jlong dataAddress)535{536LPCWSTR lpFileName = jlong_to_ptr(pathAddress);537WIN32_FILE_ATTRIBUTE_DATA* data = (WIN32_FILE_ATTRIBUTE_DATA*)jlong_to_ptr(dataAddress);538539BOOL res = GetFileAttributesExW(lpFileName, GetFileExInfoStandard, (LPVOID)data);540if (res == 0)541throwWindowsException(env, GetLastError());542}543544545JNIEXPORT void JNICALL546Java_sun_nio_fs_WindowsNativeDispatcher_SetFileTime(JNIEnv* env, jclass this,547jlong handle, jlong createTime, jlong lastAccessTime, jlong lastWriteTime)548{549HANDLE h = (HANDLE)jlong_to_ptr(handle);550551if (SetFileTime(h,552(createTime == (jlong)-1) ? NULL : (CONST FILETIME *)&createTime,553(lastAccessTime == (jlong)-1) ? NULL : (CONST FILETIME *)&lastAccessTime,554(lastWriteTime == (jlong)-1) ? NULL : (CONST FILETIME *)&lastWriteTime) == 0)555{556throwWindowsException(env, GetLastError());557}558}559560JNIEXPORT void JNICALL561Java_sun_nio_fs_WindowsNativeDispatcher_SetEndOfFile(JNIEnv* env, jclass this,562jlong handle)563{564HANDLE h = (HANDLE)jlong_to_ptr(handle);565566if (SetEndOfFile(h) == 0)567throwWindowsException(env, GetLastError());568}569570571JNIEXPORT void JNICALL572Java_sun_nio_fs_WindowsNativeDispatcher_GetVolumeInformation0(JNIEnv* env, jclass this,573jlong address, jobject obj)574{575WCHAR volumeName[MAX_PATH+1];576DWORD volumeSerialNumber;577DWORD maxComponentLength;578DWORD flags;579WCHAR fileSystemName[MAX_PATH+1];580LPCWSTR lpFileName = jlong_to_ptr(address);581jstring str;582583BOOL res = GetVolumeInformationW(lpFileName,584&volumeName[0],585MAX_PATH+1,586&volumeSerialNumber,587&maxComponentLength,588&flags,589&fileSystemName[0],590MAX_PATH+1);591if (res == 0) {592throwWindowsException(env, GetLastError());593return;594}595596str = (*env)->NewString(env, (const jchar *)fileSystemName, (jsize)wcslen(fileSystemName));597if (str == NULL) return;598(*env)->SetObjectField(env, obj, volumeInfo_fsName, str);599600str = (*env)->NewString(env, (const jchar *)volumeName, (jsize)wcslen(volumeName));601if (str == NULL) return;602(*env)->SetObjectField(env, obj, volumeInfo_volName, str);603604(*env)->SetIntField(env, obj, volumeInfo_volSN, (jint)volumeSerialNumber);605(*env)->SetIntField(env, obj, volumeInfo_flags, (jint)flags);606}607608609JNIEXPORT jint JNICALL610Java_sun_nio_fs_WindowsNativeDispatcher_GetDriveType0(JNIEnv* env, jclass this, jlong address) {611LPCWSTR lpRootPathName = jlong_to_ptr(address);612return (jint)GetDriveTypeW(lpRootPathName);613}614615616JNIEXPORT void JNICALL617Java_sun_nio_fs_WindowsNativeDispatcher_GetDiskFreeSpaceEx0(JNIEnv* env, jclass this,618jlong address, jobject obj)619{620ULARGE_INTEGER freeBytesAvailable;621ULARGE_INTEGER totalNumberOfBytes;622ULARGE_INTEGER totalNumberOfFreeBytes;623LPCWSTR lpDirName = jlong_to_ptr(address);624625626BOOL res = GetDiskFreeSpaceExW(lpDirName,627&freeBytesAvailable,628&totalNumberOfBytes,629&totalNumberOfFreeBytes);630if (res == 0) {631throwWindowsException(env, GetLastError());632return;633}634635(*env)->SetLongField(env, obj, diskSpace_bytesAvailable,636long_to_jlong(freeBytesAvailable.QuadPart));637(*env)->SetLongField(env, obj, diskSpace_totalBytes,638long_to_jlong(totalNumberOfBytes.QuadPart));639(*env)->SetLongField(env, obj, diskSpace_totalFree,640long_to_jlong(totalNumberOfFreeBytes.QuadPart));641}642643644JNIEXPORT jstring JNICALL645Java_sun_nio_fs_WindowsNativeDispatcher_GetVolumePathName0(JNIEnv* env, jclass this,646jlong address)647{648WCHAR volumeName[MAX_PATH+1];649LPCWSTR lpFileName = jlong_to_ptr(address);650651652BOOL res = GetVolumePathNameW(lpFileName,653&volumeName[0],654MAX_PATH+1);655if (res == 0) {656throwWindowsException(env, GetLastError());657return NULL;658} else {659return (*env)->NewString(env, (const jchar *)volumeName, (jsize)wcslen(volumeName));660}661}662663JNIEXPORT void JNICALL664Java_sun_nio_fs_WindowsNativeDispatcher_InitializeSecurityDescriptor(JNIEnv* env, jclass this,665jlong address)666{667PSECURITY_DESCRIPTOR pSecurityDescriptor =668(PSECURITY_DESCRIPTOR)jlong_to_ptr(address);669670if (InitializeSecurityDescriptor(pSecurityDescriptor, SECURITY_DESCRIPTOR_REVISION) == 0) {671throwWindowsException(env, GetLastError());672}673}674675JNIEXPORT void JNICALL676Java_sun_nio_fs_WindowsNativeDispatcher_InitializeAcl(JNIEnv* env, jclass this,677jlong address, jint size)678{679PACL pAcl = (PACL)jlong_to_ptr(address);680681if (InitializeAcl(pAcl, (DWORD)size, ACL_REVISION) == 0) {682throwWindowsException(env, GetLastError());683}684}685686687JNIEXPORT void JNICALL688Java_sun_nio_fs_WindowsNativeDispatcher_SetFileSecurity0(JNIEnv* env, jclass this,689jlong pathAddress, jint requestedInformation, jlong descAddress)690{691LPCWSTR lpFileName = jlong_to_ptr(pathAddress);692PSECURITY_DESCRIPTOR pSecurityDescriptor = jlong_to_ptr(descAddress);693DWORD lengthNeeded = 0;694695BOOL res = SetFileSecurityW(lpFileName,696(SECURITY_INFORMATION)requestedInformation,697pSecurityDescriptor);698699if (res == 0) {700throwWindowsException(env, GetLastError());701}702}703704JNIEXPORT jint JNICALL705Java_sun_nio_fs_WindowsNativeDispatcher_GetFileSecurity0(JNIEnv* env, jclass this,706jlong pathAddress, jint requestedInformation, jlong descAddress, jint nLength)707{708LPCWSTR lpFileName = jlong_to_ptr(pathAddress);709PSECURITY_DESCRIPTOR pSecurityDescriptor = jlong_to_ptr(descAddress);710DWORD lengthNeeded = 0;711712BOOL res = GetFileSecurityW(lpFileName,713(SECURITY_INFORMATION)requestedInformation,714pSecurityDescriptor,715(DWORD)nLength,716&lengthNeeded);717718if (res == 0) {719if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) {720return (jint)lengthNeeded;721} else {722throwWindowsException(env, GetLastError());723return 0;724}725} else {726return (jint)nLength;727}728}729730JNIEXPORT jlong JNICALL731Java_sun_nio_fs_WindowsNativeDispatcher_GetSecurityDescriptorOwner(JNIEnv* env,732jclass this, jlong address)733{734PSECURITY_DESCRIPTOR pSecurityDescriptor = jlong_to_ptr(address);735PSID pOwner;736BOOL bOwnerDefaulted;737738739if (GetSecurityDescriptorOwner(pSecurityDescriptor, &pOwner, &bOwnerDefaulted) == 0) {740throwWindowsException(env, GetLastError());741}742return ptr_to_jlong(pOwner);743}744745JNIEXPORT void JNICALL746Java_sun_nio_fs_WindowsNativeDispatcher_SetSecurityDescriptorOwner(JNIEnv* env,747jclass this, jlong descAddress, jlong ownerAddress)748{749PSECURITY_DESCRIPTOR pSecurityDescriptor = jlong_to_ptr(descAddress);750PSID pOwner = jlong_to_ptr(ownerAddress);751752if (SetSecurityDescriptorOwner(pSecurityDescriptor, pOwner, FALSE) == 0) {753throwWindowsException(env, GetLastError());754}755}756757758JNIEXPORT jlong JNICALL759Java_sun_nio_fs_WindowsNativeDispatcher_GetSecurityDescriptorDacl(JNIEnv* env,760jclass this, jlong address)761{762PSECURITY_DESCRIPTOR pSecurityDescriptor = jlong_to_ptr(address);763BOOL bDaclPresent;764PACL pDacl;765BOOL bDaclDefaulted;766767if (GetSecurityDescriptorDacl(pSecurityDescriptor, &bDaclPresent, &pDacl, &bDaclDefaulted) == 0) {768throwWindowsException(env, GetLastError());769return (jlong)0;770} else {771return (bDaclPresent) ? ptr_to_jlong(pDacl) : (jlong)0;772}773}774775JNIEXPORT void JNICALL776Java_sun_nio_fs_WindowsNativeDispatcher_SetSecurityDescriptorDacl(JNIEnv* env,777jclass this, jlong descAddress, jlong aclAddress)778{779PSECURITY_DESCRIPTOR pSecurityDescriptor = (PSECURITY_DESCRIPTOR)jlong_to_ptr(descAddress);780PACL pAcl = (PACL)jlong_to_ptr(aclAddress);781782if (SetSecurityDescriptorDacl(pSecurityDescriptor, TRUE, pAcl, FALSE) == 0) {783throwWindowsException(env, GetLastError());784}785}786787788JNIEXPORT void JNICALL789Java_sun_nio_fs_WindowsNativeDispatcher_GetAclInformation0(JNIEnv* env,790jclass this, jlong address, jobject obj)791{792PACL pAcl = (PACL)jlong_to_ptr(address);793ACL_SIZE_INFORMATION acl_size_info;794795if (GetAclInformation(pAcl, (void *) &acl_size_info, sizeof(acl_size_info), AclSizeInformation) == 0) {796throwWindowsException(env, GetLastError());797} else {798(*env)->SetIntField(env, obj, aclInfo_aceCount, (jint)acl_size_info.AceCount);799}800}801802JNIEXPORT jlong JNICALL803Java_sun_nio_fs_WindowsNativeDispatcher_GetAce(JNIEnv* env, jclass this, jlong address,804jint aceIndex)805{806PACL pAcl = (PACL)jlong_to_ptr(address);807LPVOID pAce;808809if (GetAce(pAcl, (DWORD)aceIndex, &pAce) == 0) {810throwWindowsException(env, GetLastError());811return (jlong)0;812} else {813return ptr_to_jlong(pAce);814}815}816817JNIEXPORT void JNICALL818Java_sun_nio_fs_WindowsNativeDispatcher_AddAccessAllowedAceEx(JNIEnv* env,819jclass this, jlong aclAddress, jint flags, jint mask, jlong sidAddress)820{821PACL pAcl = (PACL)jlong_to_ptr(aclAddress);822PSID pSid = (PSID)jlong_to_ptr(sidAddress);823824if (AddAccessAllowedAceEx(pAcl, ACL_REVISION, (DWORD)flags, (DWORD)mask, pSid) == 0) {825throwWindowsException(env, GetLastError());826}827}828829JNIEXPORT void JNICALL830Java_sun_nio_fs_WindowsNativeDispatcher_AddAccessDeniedAceEx(JNIEnv* env,831jclass this, jlong aclAddress, jint flags, jint mask, jlong sidAddress)832{833PACL pAcl = (PACL)jlong_to_ptr(aclAddress);834PSID pSid = (PSID)jlong_to_ptr(sidAddress);835836if (AddAccessDeniedAceEx(pAcl, ACL_REVISION, (DWORD)flags, (DWORD)mask, pSid) == 0) {837throwWindowsException(env, GetLastError());838}839}840841842JNIEXPORT void JNICALL843Java_sun_nio_fs_WindowsNativeDispatcher_LookupAccountSid0(JNIEnv* env,844jclass this, jlong address, jobject obj)845{846WCHAR domain[255];847WCHAR name[255];848DWORD domainLen = sizeof(domain);849DWORD nameLen = sizeof(name);850SID_NAME_USE use;851PSID sid = jlong_to_ptr(address);852jstring s;853854if (LookupAccountSidW(NULL, sid, &name[0], &nameLen, &domain[0], &domainLen, &use) == 0) {855throwWindowsException(env, GetLastError());856return;857}858859s = (*env)->NewString(env, (const jchar *)domain, (jsize)wcslen(domain));860if (s == NULL)861return;862(*env)->SetObjectField(env, obj, account_domain, s);863864s = (*env)->NewString(env, (const jchar *)name, (jsize)wcslen(name));865if (s == NULL)866return;867(*env)->SetObjectField(env, obj, account_name, s);868(*env)->SetIntField(env, obj, account_use, (jint)use);869}870871JNIEXPORT jint JNICALL872Java_sun_nio_fs_WindowsNativeDispatcher_LookupAccountName0(JNIEnv* env,873jclass this, jlong nameAddress, jlong sidAddress, jint cbSid)874{875876LPCWSTR accountName = jlong_to_ptr(nameAddress);877PSID sid = jlong_to_ptr(sidAddress);878WCHAR domain[255];879DWORD domainLen = sizeof(domain);880SID_NAME_USE use;881882if (LookupAccountNameW(NULL, accountName, sid, (LPDWORD)&cbSid,883&domain[0], &domainLen, &use) == 0)884{885if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) {886throwWindowsException(env, GetLastError());887}888}889890return cbSid;891}892893JNIEXPORT jint JNICALL894Java_sun_nio_fs_WindowsNativeDispatcher_GetLengthSid(JNIEnv* env,895jclass this, jlong address)896{897PSID sid = jlong_to_ptr(address);898return (jint)GetLengthSid(sid);899}900901902JNIEXPORT jstring JNICALL903Java_sun_nio_fs_WindowsNativeDispatcher_ConvertSidToStringSid(JNIEnv* env,904jclass this, jlong address)905{906PSID sid = jlong_to_ptr(address);907LPWSTR string;908if (ConvertSidToStringSidW(sid, &string) == 0) {909throwWindowsException(env, GetLastError());910return NULL;911} else {912jstring s = (*env)->NewString(env, (const jchar *)string,913(jsize)wcslen(string));914LocalFree(string);915return s;916}917}918919JNIEXPORT jlong JNICALL920Java_sun_nio_fs_WindowsNativeDispatcher_ConvertStringSidToSid0(JNIEnv* env,921jclass this, jlong address)922{923LPWSTR lpStringSid = jlong_to_ptr(address);924PSID pSid;925if (ConvertStringSidToSidW(lpStringSid, &pSid) == 0)926throwWindowsException(env, GetLastError());927return ptr_to_jlong(pSid);928}929930JNIEXPORT jlong JNICALL931Java_sun_nio_fs_WindowsNativeDispatcher_GetCurrentProcess(JNIEnv* env, jclass this) {932HANDLE hProcess = GetCurrentProcess();933return ptr_to_jlong(hProcess);934}935936JNIEXPORT jlong JNICALL937Java_sun_nio_fs_WindowsNativeDispatcher_GetCurrentThread(JNIEnv* env, jclass this) {938HANDLE hThread = GetCurrentThread();939return ptr_to_jlong(hThread);940}941942JNIEXPORT jlong JNICALL943Java_sun_nio_fs_WindowsNativeDispatcher_OpenProcessToken(JNIEnv* env,944jclass this, jlong process, jint desiredAccess)945{946HANDLE hProcess = (HANDLE)jlong_to_ptr(process);947HANDLE hToken;948949if (OpenProcessToken(hProcess, (DWORD)desiredAccess, &hToken) == 0)950throwWindowsException(env, GetLastError());951return ptr_to_jlong(hToken);952}953954JNIEXPORT jlong JNICALL955Java_sun_nio_fs_WindowsNativeDispatcher_OpenThreadToken(JNIEnv* env,956jclass this, jlong thread, jint desiredAccess, jboolean openAsSelf)957{958HANDLE hThread = (HANDLE)jlong_to_ptr(thread);959HANDLE hToken;960BOOL bOpenAsSelf = (openAsSelf == JNI_TRUE) ? TRUE : FALSE;961962if (OpenThreadToken(hThread, (DWORD)desiredAccess, bOpenAsSelf, &hToken) == 0) {963if (GetLastError() == ERROR_NO_TOKEN)964return (jlong)0;965throwWindowsException(env, GetLastError());966}967return ptr_to_jlong(hToken);968}969970JNIEXPORT jlong JNICALL971Java_sun_nio_fs_WindowsNativeDispatcher_DuplicateTokenEx(JNIEnv* env,972jclass this, jlong token, jint desiredAccess)973{974HANDLE hToken = (HANDLE)jlong_to_ptr(token);975HANDLE resultToken;976BOOL res;977978res = DuplicateTokenEx(hToken,979(DWORD)desiredAccess,980NULL,981SecurityImpersonation,982TokenImpersonation,983&resultToken);984if (res == 0)985throwWindowsException(env, GetLastError());986return ptr_to_jlong(resultToken);987}988989JNIEXPORT void JNICALL990Java_sun_nio_fs_WindowsNativeDispatcher_SetThreadToken(JNIEnv* env,991jclass this, jlong thread, jlong token)992{993HANDLE hThread = (HANDLE)jlong_to_ptr(thread);994HANDLE hToken = (HANDLE)jlong_to_ptr(token);995996if (SetThreadToken(hThread, hToken) == 0)997throwWindowsException(env, GetLastError());998}9991000JNIEXPORT jint JNICALL1001Java_sun_nio_fs_WindowsNativeDispatcher_GetTokenInformation(JNIEnv* env,1002jclass this, jlong token, jint tokenInfoClass, jlong tokenInfo, jint tokenInfoLength)1003{1004BOOL res;1005DWORD lengthNeeded;1006HANDLE hToken = (HANDLE)jlong_to_ptr(token);1007LPVOID result = (LPVOID)jlong_to_ptr(tokenInfo);10081009res = GetTokenInformation(hToken, (TOKEN_INFORMATION_CLASS)tokenInfoClass, (LPVOID)result,1010tokenInfoLength, &lengthNeeded);1011if (res == 0) {1012if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) {1013return (jint)lengthNeeded;1014} else {1015throwWindowsException(env, GetLastError());1016return 0;1017}1018} else {1019return tokenInfoLength;1020}1021}10221023JNIEXPORT void JNICALL1024Java_sun_nio_fs_WindowsNativeDispatcher_AdjustTokenPrivileges(JNIEnv* env,1025jclass this, jlong token, jlong luid, jint attributes)1026{1027TOKEN_PRIVILEGES privs[1];1028HANDLE hToken = (HANDLE)jlong_to_ptr(token);1029PLUID pLuid = (PLUID)jlong_to_ptr(luid);10301031privs[0].PrivilegeCount = 1;1032privs[0].Privileges[0].Luid = *pLuid;1033privs[0].Privileges[0].Attributes = (DWORD)attributes;10341035if (AdjustTokenPrivileges(hToken, FALSE, &privs[0], 1, NULL, NULL) == 0)1036throwWindowsException(env, GetLastError());1037}10381039JNIEXPORT jboolean JNICALL1040Java_sun_nio_fs_WindowsNativeDispatcher_AccessCheck(JNIEnv* env,1041jclass this, jlong token, jlong securityInfo, jint accessMask,1042jint genericRead, jint genericWrite, jint genericExecute, jint genericAll)1043{1044HANDLE hImpersonatedToken = (HANDLE)jlong_to_ptr(token);1045PSECURITY_DESCRIPTOR security = (PSECURITY_DESCRIPTOR)jlong_to_ptr(securityInfo);1046DWORD checkAccessRights = (DWORD)accessMask;1047GENERIC_MAPPING mapping = {1048genericRead,1049genericWrite,1050genericExecute,1051genericAll};1052PRIVILEGE_SET privileges = {0};1053DWORD privilegesLength = sizeof(privileges);1054DWORD grantedAccess = 0;1055BOOL result = FALSE;10561057/* checkAccessRights is in-out parameter */1058MapGenericMask(&checkAccessRights, &mapping);1059if (AccessCheck(security, hImpersonatedToken, checkAccessRights,1060&mapping, &privileges, &privilegesLength, &grantedAccess, &result) == 0)1061throwWindowsException(env, GetLastError());10621063return (result == FALSE) ? JNI_FALSE : JNI_TRUE;1064}10651066JNIEXPORT jlong JNICALL1067Java_sun_nio_fs_WindowsNativeDispatcher_LookupPrivilegeValue0(JNIEnv* env,1068jclass this, jlong name)1069{1070LPCWSTR lpName = (LPCWSTR)jlong_to_ptr(name);1071PLUID pLuid = LocalAlloc(0, sizeof(LUID));10721073if (pLuid == NULL) {1074JNU_ThrowInternalError(env, "Unable to allocate LUID structure");1075} else {1076if (LookupPrivilegeValueW(NULL, lpName, pLuid) == 0) {1077LocalFree(pLuid);1078throwWindowsException(env, GetLastError());1079return (jlong)0;1080}1081}1082return ptr_to_jlong(pLuid);1083}10841085JNIEXPORT void JNICALL1086Java_sun_nio_fs_WindowsNativeDispatcher_CreateSymbolicLink0(JNIEnv* env,1087jclass this, jlong linkAddress, jlong targetAddress, jint flags)1088{1089LPCWSTR link = jlong_to_ptr(linkAddress);1090LPCWSTR target = jlong_to_ptr(targetAddress);10911092if (CreateSymbolicLink_func == NULL) {1093JNU_ThrowInternalError(env, "Should not get here");1094return;1095}10961097/* On Windows 64-bit this appears to succeed even when there is insufficient privileges */1098if ((*CreateSymbolicLink_func)(link, target, (DWORD)flags) == 0)1099throwWindowsException(env, GetLastError());1100}11011102JNIEXPORT void JNICALL1103Java_sun_nio_fs_WindowsNativeDispatcher_CreateHardLink0(JNIEnv* env,1104jclass this, jlong newFileAddress, jlong existingFileAddress)1105{1106LPCWSTR newFile = jlong_to_ptr(newFileAddress);1107LPCWSTR existingFile = jlong_to_ptr(existingFileAddress);11081109if (CreateHardLinkW(newFile, existingFile, NULL) == 0)1110throwWindowsException(env, GetLastError());1111}11121113JNIEXPORT jstring JNICALL1114Java_sun_nio_fs_WindowsNativeDispatcher_GetFullPathName0(JNIEnv *env,1115jclass clz,1116jlong pathAddress)1117{1118jstring rv = NULL;1119WCHAR *lpBuf = NULL;1120WCHAR buf[MAX_PATH];1121DWORD len;1122LPCWSTR lpFileName = jlong_to_ptr(pathAddress);11231124len = GetFullPathNameW(lpFileName, MAX_PATH, buf, NULL);1125if (len > 0) {1126if (len < MAX_PATH) {1127rv = (*env)->NewString(env, buf, len);1128} else {1129len += 1; /* return length does not include terminator */1130lpBuf = (WCHAR*)malloc(len * sizeof(WCHAR));1131if (lpBuf != NULL) {1132len = GetFullPathNameW(lpFileName, len, lpBuf, NULL);1133if (len > 0) {1134rv = (*env)->NewString(env, lpBuf, len);1135} else {1136JNU_ThrowInternalError(env, "GetFullPathNameW failed");1137}1138free(lpBuf);1139} else {1140JNU_ThrowOutOfMemoryError(env, "native memory allocation failure");1141}1142}1143} else {1144throwWindowsException(env, GetLastError());1145}11461147return rv;1148}11491150JNIEXPORT jstring JNICALL1151Java_sun_nio_fs_WindowsNativeDispatcher_GetFinalPathNameByHandle(JNIEnv* env,1152jclass this, jlong handle)1153{1154jstring rv = NULL;1155WCHAR *lpBuf = NULL;1156WCHAR path[MAX_PATH];1157HANDLE h = (HANDLE)jlong_to_ptr(handle);1158DWORD len;11591160if (GetFinalPathNameByHandle_func == NULL) {1161JNU_ThrowInternalError(env, "Should not get here");1162return NULL;1163}11641165len = (*GetFinalPathNameByHandle_func)(h, path, MAX_PATH, 0);1166if (len > 0) {1167if (len < MAX_PATH) {1168rv = (*env)->NewString(env, (const jchar *)path, (jsize)len);1169} else {1170len += 1; /* return length does not include terminator */1171lpBuf = (WCHAR*)malloc(len * sizeof(WCHAR));1172if (lpBuf != NULL) {1173len = (*GetFinalPathNameByHandle_func)(h, lpBuf, len, 0);1174if (len > 0) {1175rv = (*env)->NewString(env, (const jchar *)lpBuf, (jsize)len);1176} else {1177JNU_ThrowInternalError(env, "GetFinalPathNameByHandleW failed");1178}1179free(lpBuf);1180} else {1181JNU_ThrowOutOfMemoryError(env, "native memory allocation failure");1182}1183}1184} else {1185throwWindowsException(env, GetLastError());1186}1187return rv;1188}11891190JNIEXPORT jlong JNICALL1191Java_sun_nio_fs_WindowsNativeDispatcher_CreateIoCompletionPort(JNIEnv* env, jclass this,1192jlong fileHandle, jlong existingPort, jlong completionKey)1193{1194HANDLE port = CreateIoCompletionPort((HANDLE)jlong_to_ptr(fileHandle),1195(HANDLE)jlong_to_ptr(existingPort),1196(ULONG_PTR)completionKey,11970);1198if (port == NULL) {1199throwWindowsException(env, GetLastError());1200}1201return ptr_to_jlong(port);1202}12031204JNIEXPORT void JNICALL1205Java_sun_nio_fs_WindowsNativeDispatcher_GetQueuedCompletionStatus0(JNIEnv* env, jclass this,1206jlong completionPort, jobject obj)1207{1208DWORD bytesTransferred;1209ULONG_PTR completionKey;1210OVERLAPPED *lpOverlapped;1211BOOL res;12121213res = GetQueuedCompletionStatus((HANDLE)jlong_to_ptr(completionPort),1214&bytesTransferred,1215&completionKey,1216&lpOverlapped,1217INFINITE);1218if (res == 0 && lpOverlapped == NULL) {1219throwWindowsException(env, GetLastError());1220} else {1221DWORD ioResult = (res == 0) ? GetLastError() : 0;1222(*env)->SetIntField(env, obj, completionStatus_error, ioResult);1223(*env)->SetIntField(env, obj, completionStatus_bytesTransferred,1224(jint)bytesTransferred);1225(*env)->SetLongField(env, obj, completionStatus_completionKey,1226(jlong)completionKey);1227}1228}12291230JNIEXPORT void JNICALL1231Java_sun_nio_fs_WindowsNativeDispatcher_PostQueuedCompletionStatus(JNIEnv* env, jclass this,1232jlong completionPort, jlong completionKey)1233{1234BOOL res;12351236res = PostQueuedCompletionStatus((HANDLE)jlong_to_ptr(completionPort),1237(DWORD)0, /* dwNumberOfBytesTransferred */1238(ULONG_PTR)completionKey,1239NULL); /* lpOverlapped */1240if (res == 0) {1241throwWindowsException(env, GetLastError());1242}1243}12441245JNIEXPORT void JNICALL1246Java_sun_nio_fs_WindowsNativeDispatcher_CancelIo(JNIEnv* env, jclass this, jlong hFile) {1247if (CancelIo((HANDLE)jlong_to_ptr(hFile)) == 0) {1248throwWindowsException(env, GetLastError());1249}1250}12511252JNIEXPORT jint JNICALL1253Java_sun_nio_fs_WindowsNativeDispatcher_GetOverlappedResult(JNIEnv *env, jclass this,1254jlong hFile, jlong lpOverlapped)1255{1256BOOL res;1257DWORD bytesTransferred = -1;12581259res = GetOverlappedResult((HANDLE)jlong_to_ptr(hFile),1260(LPOVERLAPPED)jlong_to_ptr(lpOverlapped),1261&bytesTransferred,1262TRUE);1263if (res == 0) {1264throwWindowsException(env, GetLastError());1265}12661267return (jint)bytesTransferred;1268}12691270JNIEXPORT void JNICALL1271Java_sun_nio_fs_WindowsNativeDispatcher_ReadDirectoryChangesW(JNIEnv* env, jclass this,1272jlong hDirectory, jlong bufferAddress, jint bufferLength, jboolean watchSubTree, jint filter,1273jlong bytesReturnedAddress, jlong pOverlapped)1274{1275BOOL res;1276BOOL subtree = (watchSubTree == JNI_TRUE) ? TRUE : FALSE;1277LPOVERLAPPED ov = (LPOVERLAPPED)jlong_to_ptr(pOverlapped);12781279res = ReadDirectoryChangesW((HANDLE)jlong_to_ptr(hDirectory),1280(LPVOID)jlong_to_ptr(bufferAddress),1281(DWORD)bufferLength,1282subtree,1283(DWORD)filter,1284(LPDWORD)jlong_to_ptr(bytesReturnedAddress),1285(LPOVERLAPPED)jlong_to_ptr(pOverlapped),1286NULL);1287if (res == 0) {1288throwWindowsException(env, GetLastError());1289}1290}12911292JNIEXPORT void JNICALL1293Java_sun_nio_fs_WindowsNativeDispatcher_BackupRead0(JNIEnv* env, jclass this,1294jlong hFile, jlong bufferAddress, jint bufferSize, jboolean abort,1295jlong context, jobject obj)1296{1297BOOL res;1298DWORD bytesTransferred;1299BOOL a = (abort == JNI_TRUE) ? TRUE : FALSE;1300VOID* pContext = (VOID*)jlong_to_ptr(context);13011302res = BackupRead((HANDLE)jlong_to_ptr(hFile),1303(LPBYTE)jlong_to_ptr(bufferAddress),1304(DWORD)bufferSize,1305&bytesTransferred,1306a,1307FALSE,1308&pContext);1309if (res == 0) {1310throwWindowsException(env, GetLastError());1311} else {1312(*env)->SetIntField(env, obj, backupResult_bytesTransferred,1313bytesTransferred);1314(*env)->SetLongField(env, obj, backupResult_context,1315ptr_to_jlong(pContext));1316}1317}13181319JNIEXPORT void JNICALL1320Java_sun_nio_fs_WindowsNativeDispatcher_BackupSeek(JNIEnv* env, jclass this,1321jlong hFile, jlong bytesToSeek, jlong context)1322{1323BOOL res;1324jint lowBytesToSeek = (jint)bytesToSeek;1325jint highBytesToSeek = (jint)(bytesToSeek >> 32);1326DWORD lowBytesSeeked;1327DWORD highBytesSeeked;1328VOID* pContext = jlong_to_ptr(context);13291330res = BackupSeek((HANDLE)jlong_to_ptr(hFile),1331(DWORD)lowBytesToSeek,1332(DWORD)highBytesToSeek,1333&lowBytesSeeked,1334&highBytesSeeked,1335&pContext);1336if (res == 0) {1337throwWindowsException(env, GetLastError());1338}1339}134013411342