94 95 static void throwWindowsException(JNIEnv* env, DWORD lastError) { 96 jobject x = JNU_NewObjectByName(env, "sun/nio/fs/WindowsException", 97 "(I)V", lastError); 98 if (x != NULL) { 99 (*env)->Throw(env, x); 100 } 101 } 102 103 /** 104 * Initializes jfieldIDs and get address of Win32 calls that are located 105 * at runtime. 106 */ 107 JNIEXPORT void JNICALL 108 Java_sun_nio_fs_WindowsNativeDispatcher_initIDs(JNIEnv* env, jclass this) 109 { 110 jclass clazz; 111 HMODULE h; 112 113 clazz = (*env)->FindClass(env, "sun/nio/fs/WindowsNativeDispatcher$FirstFile"); 114 if (clazz == NULL) { 115 return; 116 } 117 findFirst_handle = (*env)->GetFieldID(env, clazz, "handle", "J"); 118 findFirst_name = (*env)->GetFieldID(env, clazz, "name", "Ljava/lang/String;"); 119 findFirst_attributes = (*env)->GetFieldID(env, clazz, "attributes", "I"); 120 121 clazz = (*env)->FindClass(env, "sun/nio/fs/WindowsNativeDispatcher$FirstStream"); 122 if (clazz == NULL) { 123 return; 124 } 125 findStream_handle = (*env)->GetFieldID(env, clazz, "handle", "J"); 126 findStream_name = (*env)->GetFieldID(env, clazz, "name", "Ljava/lang/String;"); 127 128 clazz = (*env)->FindClass(env, "sun/nio/fs/WindowsNativeDispatcher$VolumeInformation"); 129 if (clazz == NULL) { 130 return; 131 } 132 volumeInfo_fsName = (*env)->GetFieldID(env, clazz, "fileSystemName", "Ljava/lang/String;"); 133 volumeInfo_volName = (*env)->GetFieldID(env, clazz, "volumeName", "Ljava/lang/String;"); 134 volumeInfo_volSN = (*env)->GetFieldID(env, clazz, "volumeSerialNumber", "I"); 135 volumeInfo_flags = (*env)->GetFieldID(env, clazz, "flags", "I"); 136 137 clazz = (*env)->FindClass(env, "sun/nio/fs/WindowsNativeDispatcher$DiskFreeSpace"); 138 if (clazz == NULL) { 139 return; 140 } 141 diskSpace_bytesAvailable = (*env)->GetFieldID(env, clazz, "freeBytesAvailable", "J"); 142 diskSpace_totalBytes = (*env)->GetFieldID(env, clazz, "totalNumberOfBytes", "J"); 143 diskSpace_totalFree = (*env)->GetFieldID(env, clazz, "totalNumberOfFreeBytes", "J"); 144 145 clazz = (*env)->FindClass(env, "sun/nio/fs/WindowsNativeDispatcher$Account"); 146 if (clazz == NULL) { 147 return; 148 } 149 account_domain = (*env)->GetFieldID(env, clazz, "domain", "Ljava/lang/String;"); 150 account_name = (*env)->GetFieldID(env, clazz, "name", "Ljava/lang/String;"); 151 account_use = (*env)->GetFieldID(env, clazz, "use", "I"); 152 153 clazz = (*env)->FindClass(env, "sun/nio/fs/WindowsNativeDispatcher$AclInformation"); 154 if (clazz == NULL) { 155 return; 156 } 157 aclInfo_aceCount = (*env)->GetFieldID(env, clazz, "aceCount", "I"); 158 159 clazz = (*env)->FindClass(env, "sun/nio/fs/WindowsNativeDispatcher$CompletionStatus"); 160 if (clazz == NULL) { 161 return; 162 } 163 completionStatus_error = (*env)->GetFieldID(env, clazz, "error", "I"); 164 completionStatus_bytesTransferred = (*env)->GetFieldID(env, clazz, "bytesTransferred", "I"); 165 completionStatus_completionKey = (*env)->GetFieldID(env, clazz, "completionKey", "J"); 166 167 clazz = (*env)->FindClass(env, "sun/nio/fs/WindowsNativeDispatcher$BackupResult"); 168 if (clazz == NULL) { 169 return; 170 } 171 backupResult_bytesTransferred = (*env)->GetFieldID(env, clazz, "bytesTransferred", "I"); 172 backupResult_context = (*env)->GetFieldID(env, clazz, "context", "J"); 173 174 // get handle to kernel32 175 if (GetModuleHandleExW((GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | 176 GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT), 177 (LPCWSTR)&CreateFileW, &h) != 0) 178 { 179 // requires Windows Server 2003 or newer 180 FindFirstStream_func = 181 (FindFirstStream_Proc)GetProcAddress(h, "FindFirstStreamW"); 182 FindNextStream_func = 183 (FindNextStream_Proc)GetProcAddress(h, "FindNextStreamW"); 184 185 // requires Windows Vista or newer 186 CreateSymbolicLink_func = 187 (CreateSymbolicLinkProc)GetProcAddress(h, "CreateSymbolicLinkW"); 188 GetFinalPathNameByHandle_func = 189 (GetFinalPathNameByHandleProc)GetProcAddress(h, "GetFinalPathNameByHandleW"); 190 } 191 } 192 | 94 95 static void throwWindowsException(JNIEnv* env, DWORD lastError) { 96 jobject x = JNU_NewObjectByName(env, "sun/nio/fs/WindowsException", 97 "(I)V", lastError); 98 if (x != NULL) { 99 (*env)->Throw(env, x); 100 } 101 } 102 103 /** 104 * Initializes jfieldIDs and get address of Win32 calls that are located 105 * at runtime. 106 */ 107 JNIEXPORT void JNICALL 108 Java_sun_nio_fs_WindowsNativeDispatcher_initIDs(JNIEnv* env, jclass this) 109 { 110 jclass clazz; 111 HMODULE h; 112 113 clazz = (*env)->FindClass(env, "sun/nio/fs/WindowsNativeDispatcher$FirstFile"); 114 CHECK_NULL(clazz); 115 findFirst_handle = (*env)->GetFieldID(env, clazz, "handle", "J"); 116 CHECK_NULL(findFirst_handle); 117 findFirst_name = (*env)->GetFieldID(env, clazz, "name", "Ljava/lang/String;"); 118 CHECK_NULL(findFirst_name); 119 findFirst_attributes = (*env)->GetFieldID(env, clazz, "attributes", "I"); 120 CHECK_NULL(findFirst_attributes); 121 122 clazz = (*env)->FindClass(env, "sun/nio/fs/WindowsNativeDispatcher$FirstStream"); 123 CHECK_NULL(clazz); 124 findStream_handle = (*env)->GetFieldID(env, clazz, "handle", "J"); 125 CHECK_NULL(findStream_handle); 126 findStream_name = (*env)->GetFieldID(env, clazz, "name", "Ljava/lang/String;"); 127 CHECK_NULL(findStream_name); 128 129 clazz = (*env)->FindClass(env, "sun/nio/fs/WindowsNativeDispatcher$VolumeInformation"); 130 CHECK_NULL(clazz); 131 volumeInfo_fsName = (*env)->GetFieldID(env, clazz, "fileSystemName", "Ljava/lang/String;"); 132 CHECK_NULL(volumeInfo_fsName); 133 volumeInfo_volName = (*env)->GetFieldID(env, clazz, "volumeName", "Ljava/lang/String;"); 134 CHECK_NULL(volumeInfo_volName); 135 volumeInfo_volSN = (*env)->GetFieldID(env, clazz, "volumeSerialNumber", "I"); 136 CHECK_NULL(volumeInfo_volSN); 137 volumeInfo_flags = (*env)->GetFieldID(env, clazz, "flags", "I"); 138 CHECK_NULL(volumeInfo_flags); 139 140 clazz = (*env)->FindClass(env, "sun/nio/fs/WindowsNativeDispatcher$DiskFreeSpace"); 141 CHECK_NULL(clazz); 142 diskSpace_bytesAvailable = (*env)->GetFieldID(env, clazz, "freeBytesAvailable", "J"); 143 CHECK_NULL(diskSpace_bytesAvailable); 144 diskSpace_totalBytes = (*env)->GetFieldID(env, clazz, "totalNumberOfBytes", "J"); 145 CHECK_NULL(diskSpace_totalBytes); 146 diskSpace_totalFree = (*env)->GetFieldID(env, clazz, "totalNumberOfFreeBytes", "J"); 147 CHECK_NULL(diskSpace_totalFree); 148 149 clazz = (*env)->FindClass(env, "sun/nio/fs/WindowsNativeDispatcher$Account"); 150 CHECK_NULL(clazz); 151 account_domain = (*env)->GetFieldID(env, clazz, "domain", "Ljava/lang/String;"); 152 CHECK_NULL(account_domain); 153 account_name = (*env)->GetFieldID(env, clazz, "name", "Ljava/lang/String;"); 154 CHECK_NULL(account_name); 155 account_use = (*env)->GetFieldID(env, clazz, "use", "I"); 156 CHECK_NULL(account_use); 157 158 clazz = (*env)->FindClass(env, "sun/nio/fs/WindowsNativeDispatcher$AclInformation"); 159 CHECK_NULL(clazz); 160 aclInfo_aceCount = (*env)->GetFieldID(env, clazz, "aceCount", "I"); 161 CHECK_NULL(aclInfo_aceCount); 162 163 clazz = (*env)->FindClass(env, "sun/nio/fs/WindowsNativeDispatcher$CompletionStatus"); 164 CHECK_NULL(clazz); 165 completionStatus_error = (*env)->GetFieldID(env, clazz, "error", "I"); 166 CHECK_NULL(completionStatus_error); 167 completionStatus_bytesTransferred = (*env)->GetFieldID(env, clazz, "bytesTransferred", "I"); 168 CHECK_NULL(completionStatus_bytesTransferred); 169 completionStatus_completionKey = (*env)->GetFieldID(env, clazz, "completionKey", "J"); 170 CHECK_NULL(completionStatus_completionKey); 171 172 clazz = (*env)->FindClass(env, "sun/nio/fs/WindowsNativeDispatcher$BackupResult"); 173 CHECK_NULL(clazz); 174 backupResult_bytesTransferred = (*env)->GetFieldID(env, clazz, "bytesTransferred", "I"); 175 CHECK_NULL(backupResult_bytesTransferred); 176 backupResult_context = (*env)->GetFieldID(env, clazz, "context", "J"); 177 CHECK_NULL(backupResult_context); 178 179 // get handle to kernel32 180 if (GetModuleHandleExW((GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | 181 GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT), 182 (LPCWSTR)&CreateFileW, &h) != 0) 183 { 184 // requires Windows Server 2003 or newer 185 FindFirstStream_func = 186 (FindFirstStream_Proc)GetProcAddress(h, "FindFirstStreamW"); 187 FindNextStream_func = 188 (FindNextStream_Proc)GetProcAddress(h, "FindNextStreamW"); 189 190 // requires Windows Vista or newer 191 CreateSymbolicLink_func = 192 (CreateSymbolicLinkProc)GetProcAddress(h, "CreateSymbolicLinkW"); 193 GetFinalPathNameByHandle_func = 194 (GetFinalPathNameByHandleProc)GetProcAddress(h, "GetFinalPathNameByHandleW"); 195 } 196 } 197 |