893N/A/*
3909N/A * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved.
893N/A * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
893N/A *
893N/A * This code is free software; you can redistribute it and/or modify it
893N/A * under the terms of the GNU General Public License version 2 only, as
2362N/A * published by the Free Software Foundation. Oracle designates this
893N/A * particular file as subject to the "Classpath" exception as provided
2362N/A * by Oracle in the LICENSE file that accompanied this code.
893N/A *
893N/A * This code is distributed in the hope that it will be useful, but WITHOUT
893N/A * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
893N/A * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
893N/A * version 2 for more details (a copy is included in the LICENSE file that
893N/A * accompanied this code).
893N/A *
893N/A * You should have received a copy of the GNU General Public License version
893N/A * 2 along with this work; if not, write to the Free Software Foundation,
893N/A * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
893N/A *
2362N/A * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2362N/A * or visit www.oracle.com if you need additional information or have any
2362N/A * questions.
893N/A */
893N/A
893N/A#ifndef _WIN32_WINNT
3901N/A#define _WIN32_WINNT 0x0501
893N/A#endif
893N/A
893N/A#include <stdio.h>
893N/A#include <stdlib.h>
893N/A#include <ctype.h>
893N/A#include <direct.h>
893N/A#include <malloc.h>
893N/A#include <io.h>
893N/A#include <windows.h>
893N/A#include <aclapi.h>
893N/A#include <winioctl.h>
3901N/A#include <Sddl.h>
893N/A
893N/A#include "jni.h"
893N/A#include "jni_util.h"
893N/A#include "jlong.h"
893N/A
893N/A#include "sun_nio_fs_WindowsNativeDispatcher.h"
893N/A
893N/A/**
893N/A * jfieldIDs
893N/A */
893N/Astatic jfieldID findFirst_handle;
893N/Astatic jfieldID findFirst_name;
1576N/Astatic jfieldID findFirst_attributes;
893N/A
893N/Astatic jfieldID findStream_handle;
893N/Astatic jfieldID findStream_name;
893N/A
893N/Astatic jfieldID volumeInfo_fsName;
893N/Astatic jfieldID volumeInfo_volName;
893N/Astatic jfieldID volumeInfo_volSN;
893N/Astatic jfieldID volumeInfo_flags;
893N/A
893N/Astatic jfieldID diskSpace_bytesAvailable;
893N/Astatic jfieldID diskSpace_totalBytes;
893N/Astatic jfieldID diskSpace_totalFree;
893N/A
893N/Astatic jfieldID account_domain;
893N/Astatic jfieldID account_name;
893N/Astatic jfieldID account_use;
893N/A
893N/Astatic jfieldID aclInfo_aceCount;
893N/A
893N/Astatic jfieldID completionStatus_error;
893N/Astatic jfieldID completionStatus_bytesTransferred;
893N/Astatic jfieldID completionStatus_completionKey;
893N/A
893N/Astatic jfieldID backupResult_bytesTransferred;
893N/Astatic jfieldID backupResult_context;
893N/A
893N/A
893N/A/**
3901N/A * Win32 APIs not available in Windows XP
893N/A */
3901N/Atypedef HANDLE (WINAPI* FindFirstStream_Proc)(LPCWSTR, STREAM_INFO_LEVELS, LPVOID, DWORD);
893N/Atypedef BOOL (WINAPI* FindNextStream_Proc)(HANDLE, LPVOID);
893N/A
893N/Atypedef BOOLEAN (WINAPI* CreateSymbolicLinkProc) (LPCWSTR, LPCWSTR, DWORD);
893N/Atypedef BOOL (WINAPI* GetFinalPathNameByHandleProc) (HANDLE, LPWSTR, DWORD, DWORD);
893N/A
893N/Astatic FindFirstStream_Proc FindFirstStream_func;
893N/Astatic FindNextStream_Proc FindNextStream_func;
893N/A
893N/Astatic CreateSymbolicLinkProc CreateSymbolicLink_func;
893N/Astatic GetFinalPathNameByHandleProc GetFinalPathNameByHandle_func;
893N/A
893N/Astatic void throwWindowsException(JNIEnv* env, DWORD lastError) {
893N/A jobject x = JNU_NewObjectByName(env, "sun/nio/fs/WindowsException",
893N/A "(I)V", lastError);
893N/A if (x != NULL) {
893N/A (*env)->Throw(env, x);
893N/A }
893N/A}
893N/A
893N/A/**
893N/A * Initializes jfieldIDs and get address of Win32 calls that are located
893N/A * at runtime.
893N/A */
893N/AJNIEXPORT void JNICALL
893N/AJava_sun_nio_fs_WindowsNativeDispatcher_initIDs(JNIEnv* env, jclass this)
893N/A{
893N/A jclass clazz;
893N/A HMODULE h;
893N/A
893N/A clazz = (*env)->FindClass(env, "sun/nio/fs/WindowsNativeDispatcher$FirstFile");
893N/A if (clazz == NULL) {
893N/A return;
893N/A }
893N/A findFirst_handle = (*env)->GetFieldID(env, clazz, "handle", "J");
893N/A findFirst_name = (*env)->GetFieldID(env, clazz, "name", "Ljava/lang/String;");
1576N/A findFirst_attributes = (*env)->GetFieldID(env, clazz, "attributes", "I");
893N/A
893N/A clazz = (*env)->FindClass(env, "sun/nio/fs/WindowsNativeDispatcher$FirstStream");
893N/A if (clazz == NULL) {
893N/A return;
893N/A }
893N/A findStream_handle = (*env)->GetFieldID(env, clazz, "handle", "J");
893N/A findStream_name = (*env)->GetFieldID(env, clazz, "name", "Ljava/lang/String;");
893N/A
893N/A clazz = (*env)->FindClass(env, "sun/nio/fs/WindowsNativeDispatcher$VolumeInformation");
893N/A if (clazz == NULL) {
893N/A return;
893N/A }
893N/A volumeInfo_fsName = (*env)->GetFieldID(env, clazz, "fileSystemName", "Ljava/lang/String;");
893N/A volumeInfo_volName = (*env)->GetFieldID(env, clazz, "volumeName", "Ljava/lang/String;");
893N/A volumeInfo_volSN = (*env)->GetFieldID(env, clazz, "volumeSerialNumber", "I");
893N/A volumeInfo_flags = (*env)->GetFieldID(env, clazz, "flags", "I");
893N/A
893N/A clazz = (*env)->FindClass(env, "sun/nio/fs/WindowsNativeDispatcher$DiskFreeSpace");
893N/A if (clazz == NULL) {
893N/A return;
893N/A }
893N/A diskSpace_bytesAvailable = (*env)->GetFieldID(env, clazz, "freeBytesAvailable", "J");
893N/A diskSpace_totalBytes = (*env)->GetFieldID(env, clazz, "totalNumberOfBytes", "J");
893N/A diskSpace_totalFree = (*env)->GetFieldID(env, clazz, "totalNumberOfFreeBytes", "J");
893N/A
893N/A clazz = (*env)->FindClass(env, "sun/nio/fs/WindowsNativeDispatcher$Account");
893N/A if (clazz == NULL) {
893N/A return;
893N/A }
893N/A account_domain = (*env)->GetFieldID(env, clazz, "domain", "Ljava/lang/String;");
893N/A account_name = (*env)->GetFieldID(env, clazz, "name", "Ljava/lang/String;");
893N/A account_use = (*env)->GetFieldID(env, clazz, "use", "I");
893N/A
893N/A clazz = (*env)->FindClass(env, "sun/nio/fs/WindowsNativeDispatcher$AclInformation");
893N/A if (clazz == NULL) {
893N/A return;
893N/A }
893N/A aclInfo_aceCount = (*env)->GetFieldID(env, clazz, "aceCount", "I");
893N/A
893N/A clazz = (*env)->FindClass(env, "sun/nio/fs/WindowsNativeDispatcher$CompletionStatus");
893N/A if (clazz == NULL) {
893N/A return;
893N/A }
893N/A completionStatus_error = (*env)->GetFieldID(env, clazz, "error", "I");
893N/A completionStatus_bytesTransferred = (*env)->GetFieldID(env, clazz, "bytesTransferred", "I");
893N/A completionStatus_completionKey = (*env)->GetFieldID(env, clazz, "completionKey", "I");
893N/A
893N/A clazz = (*env)->FindClass(env, "sun/nio/fs/WindowsNativeDispatcher$BackupResult");
893N/A if (clazz == NULL) {
893N/A return;
893N/A }
893N/A backupResult_bytesTransferred = (*env)->GetFieldID(env, clazz, "bytesTransferred", "I");
893N/A backupResult_context = (*env)->GetFieldID(env, clazz, "context", "J");
893N/A
3901N/A // get handle to kernel32
3901N/A if (GetModuleHandleExW((GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS |
3901N/A GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT),
3901N/A (LPCWSTR)&CreateFileW, &h) != 0)
3901N/A {
3901N/A // requires Windows Server 2003 or newer
893N/A FindFirstStream_func =
893N/A (FindFirstStream_Proc)GetProcAddress(h, "FindFirstStreamW");
893N/A FindNextStream_func =
893N/A (FindNextStream_Proc)GetProcAddress(h, "FindNextStreamW");
3901N/A
3901N/A // requires Windows Vista or newer
893N/A CreateSymbolicLink_func =
893N/A (CreateSymbolicLinkProc)GetProcAddress(h, "CreateSymbolicLinkW");
893N/A GetFinalPathNameByHandle_func =
893N/A (GetFinalPathNameByHandleProc)GetProcAddress(h, "GetFinalPathNameByHandleW");
893N/A }
893N/A}
893N/A
893N/AJNIEXPORT jstring JNICALL
893N/AJava_sun_nio_fs_WindowsNativeDispatcher_FormatMessage(JNIEnv* env, jclass this, jint errorCode) {
893N/A WCHAR message[255];
893N/A
893N/A DWORD len = FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM,
893N/A NULL,
893N/A (DWORD)errorCode,
893N/A 0,
893N/A &message[0],
893N/A 255,
893N/A NULL);
893N/A
893N/A
893N/A if (len == 0) {
893N/A return NULL;
893N/A } else {
893N/A return (*env)->NewString(env, (const jchar *)message, (jsize)wcslen(message));
893N/A }
893N/A}
893N/A
893N/AJNIEXPORT void JNICALL
893N/AJava_sun_nio_fs_WindowsNativeDispatcher_LocalFree(JNIEnv* env, jclass this, jlong address)
893N/A{
893N/A HLOCAL hMem = (HLOCAL)jlong_to_ptr(address);
893N/A LocalFree(hMem);
893N/A}
893N/A
893N/AJNIEXPORT jlong JNICALL
893N/AJava_sun_nio_fs_WindowsNativeDispatcher_CreateFile0(JNIEnv* env, jclass this,
893N/A jlong address, jint dwDesiredAccess, jint dwShareMode, jlong sdAddress,
893N/A jint dwCreationDisposition, jint dwFlagsAndAttributes)
893N/A{
893N/A HANDLE handle;
893N/A LPCWSTR lpFileName = jlong_to_ptr(address);
893N/A
893N/A SECURITY_ATTRIBUTES securityAttributes;
893N/A LPSECURITY_ATTRIBUTES lpSecurityAttributes;
893N/A PSECURITY_DESCRIPTOR lpSecurityDescriptor = jlong_to_ptr(sdAddress);
893N/A
893N/A
893N/A if (lpSecurityDescriptor == NULL) {
893N/A lpSecurityAttributes = NULL;
893N/A } else {
893N/A securityAttributes.nLength = sizeof(SECURITY_ATTRIBUTES);
893N/A securityAttributes.lpSecurityDescriptor = lpSecurityDescriptor;
893N/A securityAttributes.bInheritHandle = FALSE;
893N/A lpSecurityAttributes = &securityAttributes;
893N/A }
893N/A
893N/A handle = CreateFileW(lpFileName,
893N/A (DWORD)dwDesiredAccess,
893N/A (DWORD)dwShareMode,
893N/A lpSecurityAttributes,
893N/A (DWORD)dwCreationDisposition,
893N/A (DWORD)dwFlagsAndAttributes,
893N/A NULL);
893N/A if (handle == INVALID_HANDLE_VALUE) {
893N/A throwWindowsException(env, GetLastError());
893N/A }
893N/A return ptr_to_jlong(handle);
893N/A}
893N/A
893N/A
893N/AJNIEXPORT void JNICALL
893N/AJava_sun_nio_fs_WindowsNativeDispatcher_DeviceIoControlSetSparse(JNIEnv* env, jclass this,
893N/A jlong handle)
893N/A{
893N/A DWORD bytesReturned;
893N/A HANDLE h = (HANDLE)jlong_to_ptr(handle);
893N/A if (DeviceIoControl(h, FSCTL_SET_SPARSE, NULL, 0, NULL, 0, &bytesReturned, NULL) == 0) {
893N/A throwWindowsException(env, GetLastError());
893N/A }
893N/A}
893N/A
893N/AJNIEXPORT void JNICALL
893N/AJava_sun_nio_fs_WindowsNativeDispatcher_DeviceIoControlGetReparsePoint(JNIEnv* env, jclass this,
893N/A jlong handle, jlong bufferAddress, jint bufferSize)
893N/A{
893N/A DWORD bytesReturned;
893N/A HANDLE h = (HANDLE)jlong_to_ptr(handle);
893N/A LPVOID outBuffer = (LPVOID)jlong_to_ptr(bufferAddress);
893N/A
893N/A if (DeviceIoControl(h, FSCTL_GET_REPARSE_POINT, NULL, 0, outBuffer, (DWORD)bufferSize,
893N/A &bytesReturned, NULL) == 0)
893N/A {
893N/A throwWindowsException(env, GetLastError());
893N/A }
893N/A}
893N/A
893N/AJNIEXPORT void JNICALL
893N/AJava_sun_nio_fs_WindowsNativeDispatcher_DeleteFile0(JNIEnv* env, jclass this, jlong address)
893N/A{
893N/A LPCWSTR lpFileName = jlong_to_ptr(address);
893N/A if (DeleteFileW(lpFileName) == 0) {
893N/A throwWindowsException(env, GetLastError());
893N/A }
893N/A}
893N/A
893N/AJNIEXPORT void JNICALL
893N/AJava_sun_nio_fs_WindowsNativeDispatcher_CreateDirectory0(JNIEnv* env, jclass this,
893N/A jlong address, jlong sdAddress)
893N/A{
893N/A LPCWSTR lpFileName = jlong_to_ptr(address);
893N/A
893N/A SECURITY_ATTRIBUTES securityAttributes;
893N/A LPSECURITY_ATTRIBUTES lpSecurityAttributes;
893N/A PSECURITY_DESCRIPTOR lpSecurityDescriptor = jlong_to_ptr(sdAddress);
893N/A
893N/A
893N/A if (lpSecurityDescriptor == NULL) {
893N/A lpSecurityAttributes = NULL;
893N/A } else {
893N/A securityAttributes.nLength = sizeof(SECURITY_ATTRIBUTES);
893N/A securityAttributes.lpSecurityDescriptor = lpSecurityDescriptor;
893N/A securityAttributes.bInheritHandle = FALSE;
893N/A lpSecurityAttributes = &securityAttributes;
893N/A }
893N/A
893N/A if (CreateDirectoryW(lpFileName, lpSecurityAttributes) == 0) {
893N/A throwWindowsException(env, GetLastError());
893N/A }
893N/A}
893N/A
893N/AJNIEXPORT void JNICALL
893N/AJava_sun_nio_fs_WindowsNativeDispatcher_RemoveDirectory0(JNIEnv* env, jclass this, jlong address)
893N/A{
893N/A LPCWSTR lpFileName = jlong_to_ptr(address);
893N/A if (RemoveDirectoryW(lpFileName) == 0) {
893N/A throwWindowsException(env, GetLastError());
893N/A }
893N/A}
893N/A
893N/AJNIEXPORT void JNICALL
893N/AJava_sun_nio_fs_WindowsNativeDispatcher_CloseHandle(JNIEnv* env, jclass this,
893N/A jlong handle)
893N/A{
893N/A HANDLE h = (HANDLE)jlong_to_ptr(handle);
893N/A CloseHandle(h);
893N/A}
893N/A
893N/AJNIEXPORT void JNICALL
893N/AJava_sun_nio_fs_WindowsNativeDispatcher_FindFirstFile0(JNIEnv* env, jclass this,
893N/A jlong address, jobject obj)
893N/A{
893N/A WIN32_FIND_DATAW data;
893N/A LPCWSTR lpFileName = jlong_to_ptr(address);
893N/A
893N/A HANDLE handle = FindFirstFileW(lpFileName, &data);
893N/A if (handle != INVALID_HANDLE_VALUE) {
3499N/A jstring name = (*env)->NewString(env, data.cFileName, (jsize)wcslen(data.cFileName));
893N/A if (name == NULL)
893N/A return;
893N/A (*env)->SetLongField(env, obj, findFirst_handle, ptr_to_jlong(handle));
893N/A (*env)->SetObjectField(env, obj, findFirst_name, name);
1576N/A (*env)->SetIntField(env, obj, findFirst_attributes, data.dwFileAttributes);
893N/A } else {
893N/A throwWindowsException(env, GetLastError());
893N/A }
893N/A}
893N/A
893N/AJNIEXPORT jlong JNICALL
893N/AJava_sun_nio_fs_WindowsNativeDispatcher_FindFirstFile1(JNIEnv* env, jclass this,
893N/A jlong pathAddress, jlong dataAddress)
893N/A{
893N/A LPCWSTR lpFileName = jlong_to_ptr(pathAddress);
893N/A WIN32_FIND_DATAW* data = (WIN32_FIND_DATAW*)jlong_to_ptr(dataAddress);
893N/A
893N/A HANDLE handle = FindFirstFileW(lpFileName, data);
893N/A if (handle == INVALID_HANDLE_VALUE) {
893N/A throwWindowsException(env, GetLastError());
893N/A }
1576N/A return ptr_to_jlong(handle);
893N/A}
893N/A
893N/AJNIEXPORT jstring JNICALL
893N/AJava_sun_nio_fs_WindowsNativeDispatcher_FindNextFile(JNIEnv* env, jclass this,
907N/A jlong handle, jlong dataAddress)
893N/A{
893N/A HANDLE h = (HANDLE)jlong_to_ptr(handle);
907N/A WIN32_FIND_DATAW* data = (WIN32_FIND_DATAW*)jlong_to_ptr(dataAddress);
893N/A
907N/A if (FindNextFileW(h, data) != 0) {
3499N/A return (*env)->NewString(env, data->cFileName, (jsize)wcslen(data->cFileName));
893N/A } else {
907N/A if (GetLastError() != ERROR_NO_MORE_FILES)
907N/A throwWindowsException(env, GetLastError());
893N/A return NULL;
893N/A }
893N/A}
893N/A
893N/AJNIEXPORT void JNICALL
893N/AJava_sun_nio_fs_WindowsNativeDispatcher_FindFirstStream0(JNIEnv* env, jclass this,
893N/A jlong address, jobject obj)
893N/A{
3901N/A WIN32_FIND_STREAM_DATA data;
893N/A LPCWSTR lpFileName = jlong_to_ptr(address);
893N/A HANDLE handle;
893N/A
893N/A if (FindFirstStream_func == NULL) {
893N/A JNU_ThrowInternalError(env, "Should not get here");
893N/A return;
893N/A }
893N/A
893N/A handle = (*FindFirstStream_func)(lpFileName, FindStreamInfoStandard, &data, 0);
893N/A if (handle != INVALID_HANDLE_VALUE) {
3499N/A jstring name = (*env)->NewString(env, data.cStreamName, (jsize)wcslen(data.cStreamName));
893N/A if (name == NULL)
893N/A return;
893N/A (*env)->SetLongField(env, obj, findStream_handle, ptr_to_jlong(handle));
893N/A (*env)->SetObjectField(env, obj, findStream_name, name);
893N/A } else {
893N/A if (GetLastError() == ERROR_HANDLE_EOF) {
893N/A (*env)->SetLongField(env, obj, findStream_handle, ptr_to_jlong(handle));
893N/A } else {
893N/A throwWindowsException(env, GetLastError());
893N/A }
893N/A }
893N/A
893N/A}
893N/A
893N/AJNIEXPORT jstring JNICALL
893N/AJava_sun_nio_fs_WindowsNativeDispatcher_FindNextStream(JNIEnv* env, jclass this,
893N/A jlong handle)
893N/A{
3901N/A WIN32_FIND_STREAM_DATA data;
893N/A HANDLE h = (HANDLE)jlong_to_ptr(handle);
893N/A
893N/A if (FindNextStream_func == NULL) {
893N/A JNU_ThrowInternalError(env, "Should not get here");
893N/A return NULL;
893N/A }
893N/A
893N/A if ((*FindNextStream_func)(h, &data) != 0) {
3499N/A return (*env)->NewString(env, data.cStreamName, (jsize)wcslen(data.cStreamName));
893N/A } else {
893N/A if (GetLastError() != ERROR_HANDLE_EOF)
893N/A throwWindowsException(env, GetLastError());
893N/A return NULL;
893N/A }
893N/A}
893N/A
893N/A
893N/AJNIEXPORT void JNICALL
893N/AJava_sun_nio_fs_WindowsNativeDispatcher_FindClose(JNIEnv* env, jclass this,
893N/A jlong handle)
893N/A{
893N/A HANDLE h = (HANDLE)jlong_to_ptr(handle);
893N/A if (FindClose(h) == 0) {
893N/A throwWindowsException(env, GetLastError());
893N/A }
893N/A}
893N/A
893N/A
893N/AJNIEXPORT void JNICALL
893N/AJava_sun_nio_fs_WindowsNativeDispatcher_GetFileInformationByHandle(JNIEnv* env, jclass this,
893N/A jlong handle, jlong address)
893N/A{
893N/A HANDLE h = (HANDLE)jlong_to_ptr(handle);
893N/A BY_HANDLE_FILE_INFORMATION* info =
893N/A (BY_HANDLE_FILE_INFORMATION*)jlong_to_ptr(address);
893N/A if (GetFileInformationByHandle(h, info) == 0) {
893N/A throwWindowsException(env, GetLastError());
893N/A }
893N/A}
893N/A
893N/A
893N/AJNIEXPORT void JNICALL
893N/AJava_sun_nio_fs_WindowsNativeDispatcher_CopyFileEx0(JNIEnv* env, jclass this,
893N/A jlong existingAddress, jlong newAddress, jint flags, jlong cancelAddress)
893N/A{
893N/A LPCWSTR lpExistingFileName = jlong_to_ptr(existingAddress);
893N/A LPCWSTR lpNewFileName = jlong_to_ptr(newAddress);
893N/A LPBOOL cancel = (LPBOOL)jlong_to_ptr(cancelAddress);
893N/A if (CopyFileExW(lpExistingFileName, lpNewFileName, NULL, NULL, cancel,
893N/A (DWORD)flags) == 0)
893N/A {
893N/A throwWindowsException(env, GetLastError());
893N/A }
893N/A}
893N/A
893N/AJNIEXPORT void JNICALL
893N/AJava_sun_nio_fs_WindowsNativeDispatcher_MoveFileEx0(JNIEnv* env, jclass this,
893N/A jlong existingAddress, jlong newAddress, jint flags)
893N/A{
893N/A LPCWSTR lpExistingFileName = jlong_to_ptr(existingAddress);
893N/A LPCWSTR lpNewFileName = jlong_to_ptr(newAddress);
893N/A if (MoveFileExW(lpExistingFileName, lpNewFileName, (DWORD)flags) == 0) {
893N/A throwWindowsException(env, GetLastError());
893N/A }
893N/A}
893N/A
893N/AJNIEXPORT jint JNICALL
893N/AJava_sun_nio_fs_WindowsNativeDispatcher_GetLogicalDrives(JNIEnv* env, jclass this)
893N/A{
893N/A DWORD res = GetLogicalDrives();
893N/A if (res == 0) {
893N/A throwWindowsException(env, GetLastError());
893N/A }
893N/A return (jint)res;
893N/A}
893N/A
893N/AJNIEXPORT jint JNICALL
893N/AJava_sun_nio_fs_WindowsNativeDispatcher_GetFileAttributes0(JNIEnv* env, jclass this,
893N/A jlong address)
893N/A{
893N/A LPCWSTR lpFileName = jlong_to_ptr(address);
893N/A DWORD value = GetFileAttributesW(lpFileName);
893N/A
893N/A if (value == INVALID_FILE_ATTRIBUTES) {
893N/A throwWindowsException(env, GetLastError());
893N/A }
893N/A return (jint)value;
893N/A}
893N/A
893N/AJNIEXPORT void JNICALL
893N/AJava_sun_nio_fs_WindowsNativeDispatcher_SetFileAttributes0(JNIEnv* env, jclass this,
893N/A jlong address, jint value)
893N/A{
893N/A LPCWSTR lpFileName = jlong_to_ptr(address);
893N/A if (SetFileAttributesW(lpFileName, (DWORD)value) == 0) {
893N/A throwWindowsException(env, GetLastError());
893N/A }
893N/A}
893N/A
893N/AJNIEXPORT void JNICALL
893N/AJava_sun_nio_fs_WindowsNativeDispatcher_GetFileAttributesEx0(JNIEnv* env, jclass this,
893N/A jlong pathAddress, jlong dataAddress)
893N/A{
893N/A LPCWSTR lpFileName = jlong_to_ptr(pathAddress);
893N/A WIN32_FILE_ATTRIBUTE_DATA* data = (WIN32_FILE_ATTRIBUTE_DATA*)jlong_to_ptr(dataAddress);
893N/A
893N/A BOOL res = GetFileAttributesExW(lpFileName, GetFileExInfoStandard, (LPVOID)data);
893N/A if (res == 0)
893N/A throwWindowsException(env, GetLastError());
893N/A}
893N/A
893N/A
893N/AJNIEXPORT void JNICALL
893N/AJava_sun_nio_fs_WindowsNativeDispatcher_SetFileTime(JNIEnv* env, jclass this,
893N/A jlong handle, jlong createTime, jlong lastAccessTime, jlong lastWriteTime)
893N/A{
893N/A HANDLE h = (HANDLE)jlong_to_ptr(handle);
893N/A
893N/A if (SetFileTime(h,
1319N/A (createTime == (jlong)-1) ? NULL : (CONST FILETIME *)&createTime,
1319N/A (lastAccessTime == (jlong)-1) ? NULL : (CONST FILETIME *)&lastAccessTime,
1319N/A (lastWriteTime == (jlong)-1) ? NULL : (CONST FILETIME *)&lastWriteTime) == 0)
893N/A {
893N/A throwWindowsException(env, GetLastError());
893N/A }
893N/A}
893N/A
893N/AJNIEXPORT void JNICALL
893N/AJava_sun_nio_fs_WindowsNativeDispatcher_SetEndOfFile(JNIEnv* env, jclass this,
893N/A jlong handle)
893N/A{
893N/A HANDLE h = (HANDLE)jlong_to_ptr(handle);
893N/A
893N/A if (SetEndOfFile(h) == 0)
893N/A throwWindowsException(env, GetLastError());
893N/A}
893N/A
893N/A
893N/AJNIEXPORT void JNICALL
893N/AJava_sun_nio_fs_WindowsNativeDispatcher_GetVolumeInformation0(JNIEnv* env, jclass this,
893N/A jlong address, jobject obj)
893N/A{
893N/A WCHAR volumeName[MAX_PATH+1];
893N/A DWORD volumeSerialNumber;
893N/A DWORD maxComponentLength;
893N/A DWORD flags;
893N/A WCHAR fileSystemName[MAX_PATH+1];
893N/A LPCWSTR lpFileName = jlong_to_ptr(address);
893N/A jstring str;
893N/A
893N/A BOOL res = GetVolumeInformationW(lpFileName,
893N/A &volumeName[0],
893N/A MAX_PATH+1,
893N/A &volumeSerialNumber,
893N/A &maxComponentLength,
893N/A &flags,
893N/A &fileSystemName[0],
893N/A MAX_PATH+1);
893N/A if (res == 0) {
893N/A throwWindowsException(env, GetLastError());
893N/A return;
893N/A }
893N/A
893N/A str = (*env)->NewString(env, (const jchar *)fileSystemName, (jsize)wcslen(fileSystemName));
893N/A if (str == NULL) return;
893N/A (*env)->SetObjectField(env, obj, volumeInfo_fsName, str);
893N/A
893N/A str = (*env)->NewString(env, (const jchar *)volumeName, (jsize)wcslen(volumeName));
893N/A if (str == NULL) return;
893N/A (*env)->SetObjectField(env, obj, volumeInfo_volName, str);
893N/A
893N/A (*env)->SetIntField(env, obj, volumeInfo_volSN, (jint)volumeSerialNumber);
893N/A (*env)->SetIntField(env, obj, volumeInfo_flags, (jint)flags);
893N/A}
893N/A
893N/A
893N/AJNIEXPORT jint JNICALL
893N/AJava_sun_nio_fs_WindowsNativeDispatcher_GetDriveType0(JNIEnv* env, jclass this, jlong address) {
893N/A LPCWSTR lpRootPathName = jlong_to_ptr(address);
893N/A return (jint)GetDriveTypeW(lpRootPathName);
893N/A}
893N/A
893N/A
893N/AJNIEXPORT void JNICALL
893N/AJava_sun_nio_fs_WindowsNativeDispatcher_GetDiskFreeSpaceEx0(JNIEnv* env, jclass this,
893N/A jlong address, jobject obj)
893N/A{
893N/A ULARGE_INTEGER freeBytesAvailable;
893N/A ULARGE_INTEGER totalNumberOfBytes;
893N/A ULARGE_INTEGER totalNumberOfFreeBytes;
893N/A LPCWSTR lpDirName = jlong_to_ptr(address);
893N/A
893N/A
893N/A BOOL res = GetDiskFreeSpaceExW(lpDirName,
893N/A &freeBytesAvailable,
893N/A &totalNumberOfBytes,
893N/A &totalNumberOfFreeBytes);
893N/A if (res == 0) {
893N/A throwWindowsException(env, GetLastError());
893N/A return;
893N/A }
893N/A
893N/A (*env)->SetLongField(env, obj, diskSpace_bytesAvailable,
893N/A long_to_jlong(freeBytesAvailable.QuadPart));
893N/A (*env)->SetLongField(env, obj, diskSpace_totalBytes,
893N/A long_to_jlong(totalNumberOfBytes.QuadPart));
893N/A (*env)->SetLongField(env, obj, diskSpace_totalFree,
893N/A long_to_jlong(totalNumberOfFreeBytes.QuadPart));
893N/A}
893N/A
893N/A
893N/AJNIEXPORT jstring JNICALL
893N/AJava_sun_nio_fs_WindowsNativeDispatcher_GetVolumePathName0(JNIEnv* env, jclass this,
893N/A jlong address)
893N/A{
893N/A WCHAR volumeName[MAX_PATH+1];
893N/A LPCWSTR lpFileName = jlong_to_ptr(address);
893N/A
893N/A
893N/A BOOL res = GetVolumePathNameW(lpFileName,
893N/A &volumeName[0],
893N/A MAX_PATH+1);
893N/A if (res == 0) {
893N/A throwWindowsException(env, GetLastError());
893N/A return NULL;
893N/A } else {
893N/A return (*env)->NewString(env, (const jchar *)volumeName, (jsize)wcslen(volumeName));
893N/A }
893N/A}
893N/A
893N/AJNIEXPORT void JNICALL
893N/AJava_sun_nio_fs_WindowsNativeDispatcher_InitializeSecurityDescriptor(JNIEnv* env, jclass this,
893N/A jlong address)
893N/A{
893N/A PSECURITY_DESCRIPTOR pSecurityDescriptor =
893N/A (PSECURITY_DESCRIPTOR)jlong_to_ptr(address);
893N/A
893N/A if (InitializeSecurityDescriptor(pSecurityDescriptor, SECURITY_DESCRIPTOR_REVISION) == 0) {
893N/A throwWindowsException(env, GetLastError());
893N/A }
893N/A}
893N/A
893N/AJNIEXPORT void JNICALL
893N/AJava_sun_nio_fs_WindowsNativeDispatcher_InitializeAcl(JNIEnv* env, jclass this,
893N/A jlong address, jint size)
893N/A{
893N/A PACL pAcl = (PACL)jlong_to_ptr(address);
893N/A
893N/A if (InitializeAcl(pAcl, (DWORD)size, ACL_REVISION) == 0) {
893N/A throwWindowsException(env, GetLastError());
893N/A }
893N/A}
893N/A
893N/A
893N/AJNIEXPORT void JNICALL
893N/AJava_sun_nio_fs_WindowsNativeDispatcher_SetFileSecurity0(JNIEnv* env, jclass this,
893N/A jlong pathAddress, jint requestedInformation, jlong descAddress)
893N/A{
893N/A LPCWSTR lpFileName = jlong_to_ptr(pathAddress);
893N/A PSECURITY_DESCRIPTOR pSecurityDescriptor = jlong_to_ptr(descAddress);
893N/A DWORD lengthNeeded = 0;
893N/A
893N/A BOOL res = SetFileSecurityW(lpFileName,
893N/A (SECURITY_INFORMATION)requestedInformation,
893N/A pSecurityDescriptor);
893N/A
893N/A if (res == 0) {
893N/A throwWindowsException(env, GetLastError());
893N/A }
893N/A}
893N/A
893N/AJNIEXPORT jint JNICALL
893N/AJava_sun_nio_fs_WindowsNativeDispatcher_GetFileSecurity0(JNIEnv* env, jclass this,
893N/A jlong pathAddress, jint requestedInformation, jlong descAddress, jint nLength)
893N/A{
893N/A LPCWSTR lpFileName = jlong_to_ptr(pathAddress);
893N/A PSECURITY_DESCRIPTOR pSecurityDescriptor = jlong_to_ptr(descAddress);
893N/A DWORD lengthNeeded = 0;
893N/A
893N/A BOOL res = GetFileSecurityW(lpFileName,
893N/A (SECURITY_INFORMATION)requestedInformation,
893N/A pSecurityDescriptor,
893N/A (DWORD)nLength,
893N/A &lengthNeeded);
893N/A
893N/A if (res == 0) {
893N/A if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
893N/A return (jint)lengthNeeded;
893N/A } else {
893N/A throwWindowsException(env, GetLastError());
893N/A return 0;
893N/A }
893N/A } else {
893N/A return (jint)nLength;
893N/A }
893N/A}
893N/A
893N/AJNIEXPORT jlong JNICALL
893N/AJava_sun_nio_fs_WindowsNativeDispatcher_GetSecurityDescriptorOwner(JNIEnv* env,
893N/A jclass this, jlong address)
893N/A{
893N/A PSECURITY_DESCRIPTOR pSecurityDescriptor = jlong_to_ptr(address);
893N/A PSID pOwner;
893N/A BOOL bOwnerDefaulted;
893N/A
893N/A
893N/A if (GetSecurityDescriptorOwner(pSecurityDescriptor, &pOwner, &bOwnerDefaulted) == 0) {
893N/A throwWindowsException(env, GetLastError());
893N/A }
893N/A return ptr_to_jlong(pOwner);
893N/A}
893N/A
893N/AJNIEXPORT void JNICALL
893N/AJava_sun_nio_fs_WindowsNativeDispatcher_SetSecurityDescriptorOwner(JNIEnv* env,
893N/A jclass this, jlong descAddress, jlong ownerAddress)
893N/A{
893N/A PSECURITY_DESCRIPTOR pSecurityDescriptor = jlong_to_ptr(descAddress);
893N/A PSID pOwner = jlong_to_ptr(ownerAddress);
893N/A
893N/A if (SetSecurityDescriptorOwner(pSecurityDescriptor, pOwner, FALSE) == 0) {
893N/A throwWindowsException(env, GetLastError());
893N/A }
893N/A}
893N/A
893N/A
893N/AJNIEXPORT jlong JNICALL
893N/AJava_sun_nio_fs_WindowsNativeDispatcher_GetSecurityDescriptorDacl(JNIEnv* env,
893N/A jclass this, jlong address)
893N/A{
893N/A PSECURITY_DESCRIPTOR pSecurityDescriptor = jlong_to_ptr(address);
893N/A BOOL bDaclPresent;
893N/A PACL pDacl;
893N/A BOOL bDaclDefaulted;
893N/A
893N/A if (GetSecurityDescriptorDacl(pSecurityDescriptor, &bDaclPresent, &pDacl, &bDaclDefaulted) == 0) {
893N/A throwWindowsException(env, GetLastError());
893N/A return (jlong)0;
893N/A } else {
893N/A return (bDaclPresent) ? ptr_to_jlong(pDacl) : (jlong)0;
893N/A }
893N/A}
893N/A
893N/AJNIEXPORT void JNICALL
893N/AJava_sun_nio_fs_WindowsNativeDispatcher_SetSecurityDescriptorDacl(JNIEnv* env,
893N/A jclass this, jlong descAddress, jlong aclAddress)
893N/A{
893N/A PSECURITY_DESCRIPTOR pSecurityDescriptor = (PSECURITY_DESCRIPTOR)jlong_to_ptr(descAddress);
893N/A PACL pAcl = (PACL)jlong_to_ptr(aclAddress);
893N/A
893N/A if (SetSecurityDescriptorDacl(pSecurityDescriptor, TRUE, pAcl, FALSE) == 0) {
893N/A throwWindowsException(env, GetLastError());
893N/A }
893N/A}
893N/A
893N/A
893N/AJNIEXPORT void JNICALL
893N/AJava_sun_nio_fs_WindowsNativeDispatcher_GetAclInformation0(JNIEnv* env,
893N/A jclass this, jlong address, jobject obj)
893N/A{
893N/A PACL pAcl = (PACL)jlong_to_ptr(address);
893N/A ACL_SIZE_INFORMATION acl_size_info;
893N/A
893N/A if (GetAclInformation(pAcl, (void *) &acl_size_info, sizeof(acl_size_info), AclSizeInformation) == 0) {
893N/A throwWindowsException(env, GetLastError());
893N/A } else {
893N/A (*env)->SetIntField(env, obj, aclInfo_aceCount, (jint)acl_size_info.AceCount);
893N/A }
893N/A}
893N/A
893N/AJNIEXPORT jlong JNICALL
893N/AJava_sun_nio_fs_WindowsNativeDispatcher_GetAce(JNIEnv* env, jclass this, jlong address,
893N/A jint aceIndex)
893N/A{
893N/A PACL pAcl = (PACL)jlong_to_ptr(address);
893N/A LPVOID pAce;
893N/A
893N/A if (GetAce(pAcl, (DWORD)aceIndex, &pAce) == 0) {
893N/A throwWindowsException(env, GetLastError());
893N/A return (jlong)0;
893N/A } else {
893N/A return ptr_to_jlong(pAce);
893N/A }
893N/A}
893N/A
893N/AJNIEXPORT void JNICALL
893N/AJava_sun_nio_fs_WindowsNativeDispatcher_AddAccessAllowedAceEx(JNIEnv* env,
893N/A jclass this, jlong aclAddress, jint flags, jint mask, jlong sidAddress)
893N/A{
893N/A PACL pAcl = (PACL)jlong_to_ptr(aclAddress);
893N/A PSID pSid = (PSID)jlong_to_ptr(sidAddress);
893N/A
893N/A if (AddAccessAllowedAceEx(pAcl, ACL_REVISION, (DWORD)flags, (DWORD)mask, pSid) == 0) {
893N/A throwWindowsException(env, GetLastError());
893N/A }
893N/A}
893N/A
893N/AJNIEXPORT void JNICALL
893N/AJava_sun_nio_fs_WindowsNativeDispatcher_AddAccessDeniedAceEx(JNIEnv* env,
893N/A jclass this, jlong aclAddress, jint flags, jint mask, jlong sidAddress)
893N/A{
893N/A PACL pAcl = (PACL)jlong_to_ptr(aclAddress);
893N/A PSID pSid = (PSID)jlong_to_ptr(sidAddress);
893N/A
893N/A if (AddAccessDeniedAceEx(pAcl, ACL_REVISION, (DWORD)flags, (DWORD)mask, pSid) == 0) {
893N/A throwWindowsException(env, GetLastError());
893N/A }
893N/A}
893N/A
893N/A
893N/AJNIEXPORT void JNICALL
893N/AJava_sun_nio_fs_WindowsNativeDispatcher_LookupAccountSid0(JNIEnv* env,
893N/A jclass this, jlong address, jobject obj)
893N/A{
893N/A WCHAR domain[255];
893N/A WCHAR name[255];
893N/A DWORD domainLen = sizeof(domain);
893N/A DWORD nameLen = sizeof(name);
893N/A SID_NAME_USE use;
893N/A PSID sid = jlong_to_ptr(address);
893N/A jstring s;
893N/A
893N/A if (LookupAccountSidW(NULL, sid, &name[0], &nameLen, &domain[0], &domainLen, &use) == 0) {
893N/A throwWindowsException(env, GetLastError());
893N/A return;
893N/A }
893N/A
893N/A s = (*env)->NewString(env, (const jchar *)domain, (jsize)wcslen(domain));
893N/A if (s == NULL)
893N/A return;
893N/A (*env)->SetObjectField(env, obj, account_domain, s);
893N/A
893N/A s = (*env)->NewString(env, (const jchar *)name, (jsize)wcslen(name));
893N/A if (s == NULL)
893N/A return;
893N/A (*env)->SetObjectField(env, obj, account_name, s);
893N/A (*env)->SetIntField(env, obj, account_use, (jint)use);
893N/A}
893N/A
893N/AJNIEXPORT jint JNICALL
893N/AJava_sun_nio_fs_WindowsNativeDispatcher_LookupAccountName0(JNIEnv* env,
893N/A jclass this, jlong nameAddress, jlong sidAddress, jint cbSid)
893N/A{
893N/A
893N/A LPCWSTR accountName = jlong_to_ptr(nameAddress);
893N/A PSID sid = jlong_to_ptr(sidAddress);
893N/A WCHAR domain[255];
893N/A DWORD domainLen = sizeof(domain);
893N/A SID_NAME_USE use;
893N/A
893N/A if (LookupAccountNameW(NULL, accountName, sid, (LPDWORD)&cbSid,
893N/A &domain[0], &domainLen, &use) == 0)
893N/A {
893N/A if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) {
893N/A throwWindowsException(env, GetLastError());
893N/A }
893N/A }
893N/A
893N/A return cbSid;
893N/A}
893N/A
893N/AJNIEXPORT jint JNICALL
893N/AJava_sun_nio_fs_WindowsNativeDispatcher_GetLengthSid(JNIEnv* env,
893N/A jclass this, jlong address)
893N/A{
893N/A PSID sid = jlong_to_ptr(address);
3901N/A return (jint)GetLengthSid(sid);
893N/A}
893N/A
893N/A
893N/AJNIEXPORT jstring JNICALL
893N/AJava_sun_nio_fs_WindowsNativeDispatcher_ConvertSidToStringSid(JNIEnv* env,
893N/A jclass this, jlong address)
893N/A{
893N/A PSID sid = jlong_to_ptr(address);
893N/A LPWSTR string;
3901N/A if (ConvertSidToStringSidW(sid, &string) == 0) {
893N/A throwWindowsException(env, GetLastError());
893N/A return NULL;
893N/A } else {
893N/A jstring s = (*env)->NewString(env, (const jchar *)string,
893N/A (jsize)wcslen(string));
893N/A LocalFree(string);
893N/A return s;
893N/A }
893N/A}
893N/A
893N/AJNIEXPORT jlong JNICALL
893N/AJava_sun_nio_fs_WindowsNativeDispatcher_ConvertStringSidToSid0(JNIEnv* env,
893N/A jclass this, jlong address)
893N/A{
893N/A LPWSTR lpStringSid = jlong_to_ptr(address);
893N/A PSID pSid;
3901N/A if (ConvertStringSidToSidW(lpStringSid, &pSid) == 0)
893N/A throwWindowsException(env, GetLastError());
893N/A return ptr_to_jlong(pSid);
893N/A}
893N/A
893N/AJNIEXPORT jlong JNICALL
893N/AJava_sun_nio_fs_WindowsNativeDispatcher_GetCurrentProcess(JNIEnv* env, jclass this) {
893N/A HANDLE hProcess = GetCurrentProcess();
893N/A return ptr_to_jlong(hProcess);
893N/A}
893N/A
893N/AJNIEXPORT jlong JNICALL
893N/AJava_sun_nio_fs_WindowsNativeDispatcher_GetCurrentThread(JNIEnv* env, jclass this) {
893N/A HANDLE hThread = GetCurrentThread();
893N/A return ptr_to_jlong(hThread);
893N/A}
893N/A
893N/AJNIEXPORT jlong JNICALL
893N/AJava_sun_nio_fs_WindowsNativeDispatcher_OpenProcessToken(JNIEnv* env,
893N/A jclass this, jlong process, jint desiredAccess)
893N/A{
893N/A HANDLE hProcess = (HANDLE)jlong_to_ptr(process);
893N/A HANDLE hToken;
893N/A
893N/A if (OpenProcessToken(hProcess, (DWORD)desiredAccess, &hToken) == 0)
893N/A throwWindowsException(env, GetLastError());
893N/A return ptr_to_jlong(hToken);
893N/A}
893N/A
893N/AJNIEXPORT jlong JNICALL
893N/AJava_sun_nio_fs_WindowsNativeDispatcher_OpenThreadToken(JNIEnv* env,
893N/A jclass this, jlong thread, jint desiredAccess, jboolean openAsSelf)
893N/A{
893N/A HANDLE hThread = (HANDLE)jlong_to_ptr(thread);
893N/A HANDLE hToken;
893N/A BOOL bOpenAsSelf = (openAsSelf == JNI_TRUE) ? TRUE : FALSE;
893N/A
893N/A if (OpenThreadToken(hThread, (DWORD)desiredAccess, bOpenAsSelf, &hToken) == 0) {
893N/A if (GetLastError() == ERROR_NO_TOKEN)
893N/A return (jlong)0;
893N/A throwWindowsException(env, GetLastError());
893N/A }
893N/A return ptr_to_jlong(hToken);
893N/A}
893N/A
893N/AJNIEXPORT jlong JNICALL
893N/AJava_sun_nio_fs_WindowsNativeDispatcher_DuplicateTokenEx(JNIEnv* env,
893N/A jclass this, jlong token, jint desiredAccess)
893N/A{
893N/A HANDLE hToken = (HANDLE)jlong_to_ptr(token);
893N/A HANDLE resultToken;
893N/A BOOL res;
893N/A
893N/A res = DuplicateTokenEx(hToken,
893N/A (DWORD)desiredAccess,
893N/A NULL,
893N/A SecurityImpersonation,
893N/A TokenImpersonation,
893N/A &resultToken);
893N/A if (res == 0)
893N/A throwWindowsException(env, GetLastError());
893N/A return ptr_to_jlong(resultToken);
893N/A}
893N/A
893N/AJNIEXPORT void JNICALL
893N/AJava_sun_nio_fs_WindowsNativeDispatcher_SetThreadToken(JNIEnv* env,
893N/A jclass this, jlong thread, jlong token)
893N/A{
893N/A HANDLE hThread = (HANDLE)jlong_to_ptr(thread);
893N/A HANDLE hToken = (HANDLE)jlong_to_ptr(token);
893N/A
893N/A if (SetThreadToken(hThread, hToken) == 0)
893N/A throwWindowsException(env, GetLastError());
893N/A}
893N/A
893N/AJNIEXPORT jint JNICALL
893N/AJava_sun_nio_fs_WindowsNativeDispatcher_GetTokenInformation(JNIEnv* env,
893N/A jclass this, jlong token, jint tokenInfoClass, jlong tokenInfo, jint tokenInfoLength)
893N/A{
893N/A BOOL res;
893N/A DWORD lengthNeeded;
893N/A HANDLE hToken = (HANDLE)jlong_to_ptr(token);
893N/A LPVOID result = (LPVOID)jlong_to_ptr(tokenInfo);
893N/A
893N/A res = GetTokenInformation(hToken, (TOKEN_INFORMATION_CLASS)tokenInfoClass, (LPVOID)result,
893N/A tokenInfoLength, &lengthNeeded);
893N/A if (res == 0) {
893N/A if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
893N/A return (jint)lengthNeeded;
893N/A } else {
893N/A throwWindowsException(env, GetLastError());
893N/A return 0;
893N/A }
893N/A } else {
893N/A return tokenInfoLength;
893N/A }
893N/A}
893N/A
893N/AJNIEXPORT void JNICALL
893N/AJava_sun_nio_fs_WindowsNativeDispatcher_AdjustTokenPrivileges(JNIEnv* env,
893N/A jclass this, jlong token, jlong luid, jint attributes)
893N/A{
893N/A TOKEN_PRIVILEGES privs[1];
893N/A HANDLE hToken = (HANDLE)jlong_to_ptr(token);
893N/A PLUID pLuid = (PLUID)jlong_to_ptr(luid);
893N/A
893N/A privs[0].PrivilegeCount = 1;
893N/A privs[0].Privileges[0].Luid = *pLuid;
893N/A privs[0].Privileges[0].Attributes = (DWORD)attributes;
893N/A
893N/A if (AdjustTokenPrivileges(hToken, FALSE, &privs[0], 1, NULL, NULL) == 0)
893N/A throwWindowsException(env, GetLastError());
893N/A}
893N/A
6091N/AJNIEXPORT jboolean JNICALL
6091N/AJava_sun_nio_fs_WindowsNativeDispatcher_AccessCheck(JNIEnv* env,
6091N/A jclass this, jlong token, jlong securityInfo, jint accessMask,
6091N/A jint genericRead, jint genericWrite, jint genericExecute, jint genericAll)
6091N/A{
6091N/A HANDLE hImpersonatedToken = (HANDLE)jlong_to_ptr(token);
6091N/A PSECURITY_DESCRIPTOR security = (PSECURITY_DESCRIPTOR)jlong_to_ptr(securityInfo);
6091N/A DWORD checkAccessRights = (DWORD)accessMask;
6091N/A GENERIC_MAPPING mapping = {
6091N/A genericRead,
6091N/A genericWrite,
6091N/A genericExecute,
6091N/A genericAll};
6091N/A PRIVILEGE_SET privileges = {0};
6091N/A DWORD privilegesLength = sizeof(privileges);
6091N/A DWORD grantedAccess = 0;
6091N/A BOOL result = FALSE;
6091N/A
6091N/A /* checkAccessRights is in-out parameter */
6091N/A MapGenericMask(&checkAccessRights, &mapping);
6091N/A if (AccessCheck(security, hImpersonatedToken, checkAccessRights,
6091N/A &mapping, &privileges, &privilegesLength, &grantedAccess, &result) == 0)
6091N/A throwWindowsException(env, GetLastError());
6091N/A
6091N/A return (result == FALSE) ? JNI_FALSE : JNI_TRUE;
6091N/A}
6091N/A
893N/AJNIEXPORT jlong JNICALL
893N/AJava_sun_nio_fs_WindowsNativeDispatcher_LookupPrivilegeValue0(JNIEnv* env,
893N/A jclass this, jlong name)
893N/A{
893N/A LPCWSTR lpName = (LPCWSTR)jlong_to_ptr(name);
893N/A PLUID pLuid = LocalAlloc(0, sizeof(LUID));
893N/A
893N/A if (pLuid == NULL) {
893N/A JNU_ThrowInternalError(env, "Unable to allocate LUID structure");
893N/A } else {
893N/A if (LookupPrivilegeValueW(NULL, lpName, pLuid) == 0)
893N/A throwWindowsException(env, GetLastError());
893N/A }
893N/A return ptr_to_jlong(pLuid);
893N/A}
893N/A
893N/AJNIEXPORT void JNICALL
893N/AJava_sun_nio_fs_WindowsNativeDispatcher_CreateSymbolicLink0(JNIEnv* env,
893N/A jclass this, jlong linkAddress, jlong targetAddress, jint flags)
893N/A{
893N/A LPCWSTR link = jlong_to_ptr(linkAddress);
893N/A LPCWSTR target = jlong_to_ptr(targetAddress);
893N/A
893N/A if (CreateSymbolicLink_func == NULL) {
893N/A JNU_ThrowInternalError(env, "Should not get here");
893N/A return;
893N/A }
893N/A
893N/A /* On Windows 64-bit this appears to succeed even when there is insufficient privileges */
893N/A if ((*CreateSymbolicLink_func)(link, target, (DWORD)flags) == 0)
893N/A throwWindowsException(env, GetLastError());
893N/A}
893N/A
893N/AJNIEXPORT void JNICALL
893N/AJava_sun_nio_fs_WindowsNativeDispatcher_CreateHardLink0(JNIEnv* env,
893N/A jclass this, jlong newFileAddress, jlong existingFileAddress)
893N/A{
893N/A LPCWSTR newFile = jlong_to_ptr(newFileAddress);
893N/A LPCWSTR existingFile = jlong_to_ptr(existingFileAddress);
893N/A
3901N/A if (CreateHardLinkW(newFile, existingFile, NULL) == 0)
893N/A throwWindowsException(env, GetLastError());
893N/A}
893N/A
893N/AJNIEXPORT jstring JNICALL
893N/AJava_sun_nio_fs_WindowsNativeDispatcher_GetFullPathName0(JNIEnv *env,
893N/A jclass clz,
893N/A jlong pathAddress)
893N/A{
893N/A jstring rv = NULL;
893N/A WCHAR *lpBuf = NULL;
893N/A WCHAR buf[MAX_PATH];
893N/A DWORD len;
893N/A LPCWSTR lpFileName = jlong_to_ptr(pathAddress);
893N/A
893N/A len = GetFullPathNameW(lpFileName, MAX_PATH, buf, NULL);
893N/A if (len > 0) {
893N/A if (len < MAX_PATH) {
893N/A rv = (*env)->NewString(env, buf, len);
893N/A } else {
893N/A len += 1; /* return length does not include terminator */
893N/A lpBuf = (WCHAR*)malloc(len * sizeof(WCHAR));
893N/A if (lpBuf != NULL) {
893N/A len = GetFullPathNameW(lpFileName, len, lpBuf, NULL);
893N/A if (len > 0) {
893N/A rv = (*env)->NewString(env, lpBuf, len);
893N/A } else {
893N/A JNU_ThrowInternalError(env, "GetFullPathNameW failed");
893N/A }
893N/A free(lpBuf);
893N/A }
893N/A }
893N/A }
893N/A if (len == 0)
893N/A throwWindowsException(env, GetLastError());
893N/A
893N/A return rv;
893N/A}
893N/A
893N/AJNIEXPORT jstring JNICALL
893N/AJava_sun_nio_fs_WindowsNativeDispatcher_GetFinalPathNameByHandle(JNIEnv* env,
893N/A jclass this, jlong handle)
893N/A{
893N/A jstring rv = NULL;
893N/A WCHAR *lpBuf = NULL;
893N/A WCHAR path[MAX_PATH];
893N/A HANDLE h = (HANDLE)jlong_to_ptr(handle);
893N/A DWORD len;
893N/A
893N/A if (GetFinalPathNameByHandle_func == NULL) {
893N/A JNU_ThrowInternalError(env, "Should not get here");
893N/A return NULL;
893N/A }
893N/A
893N/A len = (*GetFinalPathNameByHandle_func)(h, path, MAX_PATH, 0);
893N/A if (len > 0) {
893N/A if (len < MAX_PATH) {
893N/A rv = (*env)->NewString(env, (const jchar *)path, (jsize)len);
893N/A } else {
893N/A len += 1; /* return length does not include terminator */
893N/A lpBuf = (WCHAR*)malloc(len * sizeof(WCHAR));
893N/A if (lpBuf != NULL) {
893N/A len = (*GetFinalPathNameByHandle_func)(h, lpBuf, len, 0);
893N/A if (len > 0) {
893N/A rv = (*env)->NewString(env, (const jchar *)lpBuf, (jsize)len);
893N/A } else {
893N/A JNU_ThrowInternalError(env, "GetFinalPathNameByHandleW failed");
893N/A }
893N/A free(lpBuf);
893N/A }
893N/A }
893N/A }
893N/A
893N/A if (len == 0)
893N/A throwWindowsException(env, GetLastError());
893N/A
893N/A return rv;
893N/A}
893N/A
893N/AJNIEXPORT jlong JNICALL
893N/AJava_sun_nio_fs_WindowsNativeDispatcher_CreateIoCompletionPort(JNIEnv* env, jclass this,
893N/A jlong fileHandle, jlong existingPort, jint completionKey)
893N/A{
3499N/A ULONG_PTR ck = completionKey;
893N/A HANDLE port = CreateIoCompletionPort((HANDLE)jlong_to_ptr(fileHandle),
893N/A (HANDLE)jlong_to_ptr(existingPort),
3499N/A ck,
893N/A 0);
893N/A if (port == NULL) {
893N/A throwWindowsException(env, GetLastError());
893N/A }
893N/A return ptr_to_jlong(port);
893N/A}
893N/A
893N/AJNIEXPORT void JNICALL
893N/AJava_sun_nio_fs_WindowsNativeDispatcher_GetQueuedCompletionStatus0(JNIEnv* env, jclass this,
893N/A jlong completionPort, jobject obj)
893N/A{
893N/A DWORD bytesTransferred;
3499N/A ULONG_PTR completionKey;
893N/A OVERLAPPED *lpOverlapped;
893N/A BOOL res;
893N/A
893N/A res = GetQueuedCompletionStatus((HANDLE)jlong_to_ptr(completionPort),
893N/A &bytesTransferred,
893N/A &completionKey,
893N/A &lpOverlapped,
893N/A INFINITE);
893N/A if (res == 0 && lpOverlapped == NULL) {
893N/A throwWindowsException(env, GetLastError());
893N/A } else {
893N/A DWORD ioResult = (res == 0) ? GetLastError() : 0;
893N/A (*env)->SetIntField(env, obj, completionStatus_error, ioResult);
893N/A (*env)->SetIntField(env, obj, completionStatus_bytesTransferred,
893N/A (jint)bytesTransferred);
893N/A (*env)->SetIntField(env, obj, completionStatus_completionKey,
893N/A (jint)completionKey);
893N/A
893N/A }
893N/A}
893N/A
893N/AJNIEXPORT void JNICALL
893N/AJava_sun_nio_fs_WindowsNativeDispatcher_PostQueuedCompletionStatus(JNIEnv* env, jclass this,
893N/A jlong completionPort, jint completionKey)
893N/A{
893N/A BOOL res;
893N/A
893N/A res = PostQueuedCompletionStatus((HANDLE)jlong_to_ptr(completionPort),
893N/A (DWORD)0, /* dwNumberOfBytesTransferred */
893N/A (DWORD)completionKey,
893N/A NULL); /* lpOverlapped */
893N/A if (res == 0) {
893N/A throwWindowsException(env, GetLastError());
893N/A }
893N/A}
893N/A
893N/AJNIEXPORT void JNICALL
893N/AJava_sun_nio_fs_WindowsNativeDispatcher_ReadDirectoryChangesW(JNIEnv* env, jclass this,
893N/A jlong hDirectory, jlong bufferAddress, jint bufferLength, jboolean watchSubTree, jint filter,
893N/A jlong bytesReturnedAddress, jlong pOverlapped)
893N/A{
893N/A BOOL res;
893N/A BOOL subtree = (watchSubTree == JNI_TRUE) ? TRUE : FALSE;
893N/A
893N/A ((LPOVERLAPPED)jlong_to_ptr(pOverlapped))->hEvent = NULL;
893N/A res = ReadDirectoryChangesW((HANDLE)jlong_to_ptr(hDirectory),
893N/A (LPVOID)jlong_to_ptr(bufferAddress),
893N/A (DWORD)bufferLength,
893N/A subtree,
893N/A (DWORD)filter,
893N/A (LPDWORD)jlong_to_ptr(bytesReturnedAddress),
893N/A (LPOVERLAPPED)jlong_to_ptr(pOverlapped),
893N/A NULL);
893N/A if (res == 0) {
893N/A throwWindowsException(env, GetLastError());
893N/A }
893N/A}
893N/A
893N/AJNIEXPORT void JNICALL
893N/AJava_sun_nio_fs_WindowsNativeDispatcher_BackupRead0(JNIEnv* env, jclass this,
893N/A jlong hFile, jlong bufferAddress, jint bufferSize, jboolean abort,
893N/A jlong context, jobject obj)
893N/A{
893N/A BOOL res;
893N/A DWORD bytesTransferred;
893N/A BOOL a = (abort == JNI_TRUE) ? TRUE : FALSE;
893N/A VOID* pContext = (VOID*)jlong_to_ptr(context);
893N/A
893N/A res = BackupRead((HANDLE)jlong_to_ptr(hFile),
893N/A (LPBYTE)jlong_to_ptr(bufferAddress),
893N/A (DWORD)bufferSize,
893N/A &bytesTransferred,
893N/A a,
893N/A FALSE,
893N/A &pContext);
893N/A if (res == 0) {
893N/A throwWindowsException(env, GetLastError());
893N/A } else {
893N/A (*env)->SetIntField(env, obj, backupResult_bytesTransferred,
893N/A bytesTransferred);
893N/A (*env)->SetLongField(env, obj, backupResult_context,
893N/A ptr_to_jlong(pContext));
893N/A }
893N/A}
893N/A
893N/AJNIEXPORT void JNICALL
893N/AJava_sun_nio_fs_WindowsNativeDispatcher_BackupSeek(JNIEnv* env, jclass this,
893N/A jlong hFile, jlong bytesToSeek, jlong context)
893N/A{
893N/A BOOL res;
893N/A jint lowBytesToSeek = (jint)bytesToSeek;
893N/A jint highBytesToSeek = (jint)(bytesToSeek >> 32);
893N/A DWORD lowBytesSeeked;
893N/A DWORD highBytesSeeked;
893N/A VOID* pContext = jlong_to_ptr(context);
893N/A
893N/A res = BackupSeek((HANDLE)jlong_to_ptr(hFile),
893N/A (DWORD)lowBytesToSeek,
893N/A (DWORD)highBytesToSeek,
893N/A &lowBytesSeeked,
893N/A &highBytesSeeked,
893N/A &pContext);
893N/A if (res == 0) {
893N/A throwWindowsException(env, GetLastError());
893N/A }
893N/A}