src/windows/native/sun/nio/fs/WindowsNativeDispatcher.c

Print this page




  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