4
4
use crate :: { PyRef , VirtualMachine , builtins:: PyModule } ;
5
5
6
6
pub ( crate ) fn make_module ( vm : & VirtualMachine ) -> PyRef < PyModule > {
7
- let module = winreg:: make_module ( vm) ;
8
- module
7
+ winreg:: make_module ( vm)
9
8
}
10
9
11
10
#[ pymodule]
@@ -53,48 +52,55 @@ mod winreg {
53
52
#[ pyattr( once) ]
54
53
fn HKEY_CLASSES_ROOT ( _vm : & VirtualMachine ) -> PyHKEYObject {
55
54
PyHKEYObject {
55
+ #[ allow( clippy:: arc_with_non_send_sync) ]
56
56
hkey : Arc :: new ( PyRwLock :: new ( Registry :: HKEY_CLASSES_ROOT ) ) ,
57
57
}
58
58
}
59
59
60
60
#[ pyattr( once) ]
61
61
fn HKEY_CURRENT_USER ( _vm : & VirtualMachine ) -> PyHKEYObject {
62
62
PyHKEYObject {
63
+ #[ allow( clippy:: arc_with_non_send_sync) ]
63
64
hkey : Arc :: new ( PyRwLock :: new ( Registry :: HKEY_CURRENT_USER ) ) ,
64
65
}
65
66
}
66
67
67
68
#[ pyattr( once) ]
68
69
fn HKEY_LOCAL_MACHINE ( _vm : & VirtualMachine ) -> PyHKEYObject {
69
70
PyHKEYObject {
71
+ #[ allow( clippy:: arc_with_non_send_sync) ]
70
72
hkey : Arc :: new ( PyRwLock :: new ( Registry :: HKEY_LOCAL_MACHINE ) ) ,
71
73
}
72
74
}
73
75
74
76
#[ pyattr( once) ]
75
77
fn HKEY_USERS ( _vm : & VirtualMachine ) -> PyHKEYObject {
76
78
PyHKEYObject {
79
+ #[ allow( clippy:: arc_with_non_send_sync) ]
77
80
hkey : Arc :: new ( PyRwLock :: new ( Registry :: HKEY_USERS ) ) ,
78
81
}
79
82
}
80
83
81
84
#[ pyattr( once) ]
82
85
fn HKEY_PERFORMANCE_DATA ( _vm : & VirtualMachine ) -> PyHKEYObject {
83
86
PyHKEYObject {
87
+ #[ allow( clippy:: arc_with_non_send_sync) ]
84
88
hkey : Arc :: new ( PyRwLock :: new ( Registry :: HKEY_PERFORMANCE_DATA ) ) ,
85
89
}
86
90
}
87
91
88
92
#[ pyattr( once) ]
89
93
fn HKEY_CURRENT_CONFIG ( _vm : & VirtualMachine ) -> PyHKEYObject {
90
94
PyHKEYObject {
95
+ #[ allow( clippy:: arc_with_non_send_sync) ]
91
96
hkey : Arc :: new ( PyRwLock :: new ( Registry :: HKEY_CURRENT_CONFIG ) ) ,
92
97
}
93
98
}
94
99
95
100
#[ pyattr( once) ]
96
101
fn HKEY_DYN_DATA ( _vm : & VirtualMachine ) -> PyHKEYObject {
97
102
PyHKEYObject {
103
+ #[ allow( clippy:: arc_with_non_send_sync) ]
98
104
hkey : Arc :: new ( PyRwLock :: new ( Registry :: HKEY_DYN_DATA ) ) ,
99
105
}
100
106
}
@@ -266,7 +272,7 @@ mod winreg {
266
272
Registry :: RegConnectRegistryW (
267
273
wide_computer_name. as_ptr ( ) ,
268
274
* key. hkey . read ( ) ,
269
- & mut ret_key
275
+ & mut ret_key,
270
276
)
271
277
} ;
272
278
if res == 0 {
@@ -277,11 +283,7 @@ mod winreg {
277
283
} else {
278
284
let mut ret_key = std:: ptr:: null_mut ( ) ;
279
285
let res = unsafe {
280
- Registry :: RegConnectRegistryW (
281
- std:: ptr:: null_mut ( ) ,
282
- * key. hkey . read ( ) ,
283
- & mut ret_key
284
- )
286
+ Registry :: RegConnectRegistryW ( std:: ptr:: null_mut ( ) , * key. hkey . read ( ) , & mut ret_key)
285
287
} ;
286
288
if res == 0 {
287
289
Ok ( PyHKEYObject :: new ( ret_key) )
@@ -436,18 +438,15 @@ mod winreg {
436
438
)
437
439
} ;
438
440
if rc != 0 {
439
- return Err ( vm. new_os_error ( format ! (
440
- "RegQueryInfoKeyW failed with error code {}" ,
441
- rc
442
- ) ) ) ;
441
+ return Err ( vm. new_os_error ( format ! ( "RegQueryInfoKeyW failed with error code {}" , rc) ) ) ;
443
442
}
444
-
443
+
445
444
// Include room for null terminators.
446
445
ret_value_size += 1 ;
447
446
ret_data_size += 1 ;
448
447
let mut buf_value_size = ret_value_size;
449
448
let mut buf_data_size = ret_data_size;
450
-
449
+
451
450
// Allocate buffers.
452
451
let mut ret_value_buf: Vec < u16 > = vec ! [ 0 ; ret_value_size as usize ] ;
453
452
let mut ret_data_buf: Vec < u8 > = vec ! [ 0 ; ret_data_size as usize ] ;
@@ -484,12 +483,9 @@ mod winreg {
484
483
continue ;
485
484
}
486
485
if rc != 0 {
487
- return Err ( vm. new_os_error ( format ! (
488
- "RegEnumValueW failed with error code {}" ,
489
- rc
490
- ) ) ) ;
486
+ return Err ( vm. new_os_error ( format ! ( "RegEnumValueW failed with error code {}" , rc) ) ) ;
491
487
}
492
-
488
+
493
489
// At this point, current_value_size and current_data_size have been updated.
494
490
// Retrieve the registry type.
495
491
let mut reg_type: u32 = 0 ;
@@ -505,25 +501,28 @@ mod winreg {
505
501
& mut current_data_size as * mut u32 ,
506
502
)
507
503
} ;
508
-
504
+
509
505
// Convert the registry value name from UTF‑16.
510
506
let name_len = ret_value_buf
511
507
. iter ( )
512
508
. position ( |& c| c == 0 )
513
509
. unwrap_or ( ret_value_buf. len ( ) ) ;
514
510
let name = String :: from_utf16 ( & ret_value_buf[ ..name_len] )
515
511
. map_err ( |e| vm. new_value_error ( format ! ( "UTF16 conversion error: {}" , e) ) ) ?;
516
-
512
+
517
513
// Slice the data buffer to the actual size returned.
518
514
let data_slice = & ret_data_buf[ ..current_data_size as usize ] ;
519
515
let py_data = reg_to_py ( vm, data_slice, reg_type) ?;
520
-
516
+
521
517
// Return tuple (value_name, data, type)
522
- return Ok ( vm. ctx . new_tuple ( vec ! [
523
- vm. ctx. new_str( name) . into( ) ,
524
- py_data,
525
- vm. ctx. new_int( reg_type) . into( ) ,
526
- ] ) . into ( ) ) ;
518
+ return Ok ( vm
519
+ . ctx
520
+ . new_tuple ( vec ! [
521
+ vm. ctx. new_str( name) . into( ) ,
522
+ py_data,
523
+ vm. ctx. new_int( reg_type) . into( ) ,
524
+ ] )
525
+ . into ( ) ) ;
527
526
}
528
527
}
529
528
@@ -614,8 +613,13 @@ mod winreg {
614
613
if err != 0 {
615
614
return Err ( vm. new_os_error ( format ! ( "error code: {}" , err) ) ) ;
616
615
}
617
- let l: u64 = ( lpftlastwritetime. dwHighDateTime as u64 ) << 32 | lpftlastwritetime. dwLowDateTime as u64 ;
618
- let tup: Vec < PyObjectRef > = vec ! [ vm. ctx. new_int( lpcsubkeys) . into( ) , vm. ctx. new_int( lpcvalues) . into( ) , vm. ctx. new_int( l) . into( ) ] ;
616
+ let l: u64 = ( lpftlastwritetime. dwHighDateTime as u64 ) << 32
617
+ | lpftlastwritetime. dwLowDateTime as u64 ;
618
+ let tup: Vec < PyObjectRef > = vec ! [
619
+ vm. ctx. new_int( lpcsubkeys) . into( ) ,
620
+ vm. ctx. new_int( lpcvalues) . into( ) ,
621
+ vm. ctx. new_int( l) . into( ) ,
622
+ ] ;
619
623
Ok ( vm. ctx . new_tuple ( tup) )
620
624
}
621
625
@@ -642,7 +646,11 @@ mod winreg {
642
646
}
643
647
644
648
#[ pyfunction]
645
- fn QueryValueEx ( key : PyRef < PyHKEYObject > , name : String , vm : & VirtualMachine ) -> PyResult < PyObjectRef > {
649
+ fn QueryValueEx (
650
+ key : PyRef < PyHKEYObject > ,
651
+ name : String ,
652
+ vm : & VirtualMachine ,
653
+ ) -> PyResult < PyObjectRef > {
646
654
let wide_name = to_utf16 ( name) ;
647
655
let mut buf_size = 0 ;
648
656
let res = unsafe {
@@ -693,11 +701,17 @@ mod winreg {
693
701
}
694
702
695
703
#[ pyfunction]
696
- fn SetValue ( key : PyRef < PyHKEYObject > , sub_key : String , typ : u32 , value : String , vm : & VirtualMachine ) -> PyResult < ( ) > {
704
+ fn SetValue (
705
+ key : PyRef < PyHKEYObject > ,
706
+ sub_key : String ,
707
+ typ : u32 ,
708
+ value : String ,
709
+ vm : & VirtualMachine ,
710
+ ) -> PyResult < ( ) > {
697
711
if typ != Registry :: REG_SZ {
698
712
return Err ( vm. new_type_error ( "type must be winreg.REG_SZ" . to_string ( ) ) ) ;
699
713
}
700
-
714
+
701
715
let wide_sub_key = to_utf16 ( sub_key) ;
702
716
703
717
// TODO: Value check
@@ -753,7 +767,10 @@ mod winreg {
753
767
std:: slice:: from_raw_parts ( ret_data. as_ptr ( ) as * const u16 , u16_count)
754
768
} ;
755
769
// Only use characters up to the first NUL.
756
- let len = u16_slice. iter ( ) . position ( |& c| c == 0 ) . unwrap_or ( u16_slice. len ( ) ) ;
770
+ let len = u16_slice
771
+ . iter ( )
772
+ . position ( |& c| c == 0 )
773
+ . unwrap_or ( u16_slice. len ( ) ) ;
757
774
let s = String :: from_utf16 ( & u16_slice[ ..len] )
758
775
. map_err ( |e| vm. new_value_error ( format ! ( "UTF16 error: {}" , e) ) ) ?;
759
776
Ok ( vm. ctx . new_str ( s) . into ( ) )
@@ -814,10 +831,11 @@ mod winreg {
814
831
}
815
832
// REG_SZ is fallthrough
816
833
REG_EXPAND_SZ => {
817
- return Err ( vm. new_type_error ( "TODO: RUSTPYTHON REG_EXPAND_SZ is not supported" . to_string ( ) ) ) ;
834
+ Err ( vm
835
+ . new_type_error ( "TODO: RUSTPYTHON REG_EXPAND_SZ is not supported" . to_string ( ) ) )
818
836
}
819
837
REG_MULTI_SZ => {
820
- return Err ( vm. new_type_error ( "TODO: RUSTPYTHON REG_MULTI_SZ is not supported" . to_string ( ) ) ) ;
838
+ Err ( vm. new_type_error ( "TODO: RUSTPYTHON REG_MULTI_SZ is not supported" . to_string ( ) ) )
821
839
}
822
840
// REG_BINARY is fallthrough
823
841
_ => {
@@ -856,7 +874,7 @@ mod winreg {
856
874
if res != 0 {
857
875
return Err ( vm. new_os_error ( format ! ( "error code: {}" , res) ) ) ;
858
876
}
859
- } ,
877
+ }
860
878
Ok ( None ) => {
861
879
let len = 0 ;
862
880
let ptr = std:: ptr:: null ( ) ;
@@ -874,7 +892,7 @@ mod winreg {
874
892
if res != 0 {
875
893
return Err ( vm. new_os_error ( format ! ( "error code: {}" , res) ) ) ;
876
894
}
877
- } ,
895
+ }
878
896
Err ( _) => return Err ( vm. new_type_error ( "value must be an integer" . to_string ( ) ) ) ,
879
897
}
880
898
Ok ( ( ) )
0 commit comments