------------------------------------------------------------ [BUG/PRB.] VFP 9.0 FIX - SQLSETPROP() FUNCTION January 2024 ------------------------------------------------------------ CCB 1. BUG: In vfp9 (and vfp6, vfp7, vfp8), sometimes the SQLSETPROP(0,"Transactions",1) function causes the error "Connection 0# is busy (Error 1541)". The bug only occurs on some Windows versions or some ODBC drivers. 2. CAUSE: There are some BUGs in the following code. 3. RESOLUTION: We can write some code to fix the BUG. Fun882c46 :: ; proc near push ebp ;0x00882c46 : 55 mov ebp , esp ;0x00882c47 : 8bec sub esp , 0104h ;0x00882c49 : 81ec04010000 mov eax , dword ptr [ Data937090 ] ;0x00882c4f : a190709300 push esi ;0x00882c54 : 56 mov esi , dword ptr [ ebp + 8 ] ;0x00882c55 : 8b7508 imul esi , esi , 0158h ;0x00882c58 : 69f658010000 mov dword ptr [ ebp - 4 ] , eax ;0x00882c5e : 8945fc mov eax , dword ptr [ Data93b94c ] ;0x00882c61 : a14cb99300 mov ecx , dword ptr [eax] ;0x00882c66 : 8b08 mov cl , byte ptr [ esi + ecx + 65 ] ;0x00882c68 : 8a4c0e41 test cl , cl ;0x00882c6c : 84c9 je Label882cba ;0x00882c6e : 744a movzx ecx , cl ;0x00882c70 : 660fb6c9 cmp cx , word ptr [ ebp + 12 ] ;0x00882c74 : 663b4d0c je Label882cba ;0x00882c78 : 7440 and dword ptr [ebx] , 00h ;0x00882c7a : 832300 mov eax , dword ptr [eax] ;0x00882c7d : 8b00 mov al , byte ptr [ esi + eax + 65 ] ;0x00882c7f : 8a440641 cmp al , 01h ;0x00882c83 : 3c01 jne Label882c8e ;0x00882c85 : 7507 mov ecx , 01DAh ;0x00882c87 : b9da010000 jmp Label882cb5 ;0x00882c8c : eb27 Label882c8e :: cmp al , 02h ;0x00882c8e : 3c02 jne Label882c99 ;0x00882c90 : 7507 mov ecx , 01DBh ;0x00882c92 : b9db010000 jmp Label882cb5 ;0x00882c97 : eb1c Label882c99 :: cmp al , 03h ;0x00882c99 : 3c03 jne Label882ca4 ;0x00882c9b : 7507 mov ecx , 01DCh ;0x00882c9d : b9dc010000 jmp Label882cb5 ;0x00882ca2 : eb11 Label882ca4 :: xor ecx , ecx ;0x00882ca4 : 33c9 cmp al , 04h ;0x00882ca6 : 3c04 setne cl ;0x00882ca8 : 0f95c1 dec ecx ;0x00882cab : 49 and ecx , 0Ch ;0x00882cac : 83e10c add ecx , 01D1h ;0x00882caf : 81c1d1010000 Label882cb5 :: call Fun544742 ;0x00882cb5 : e8881accff Label882cba :: mov dword ptr [ebx] , 01h ;0x00882cba : c70301000000 cmp word ptr [ ebp + 12 ] , 02h ;0x00882cc0 : 66837d0c02 je Label882cd8 ;0x00882cc5 : 7411 mov ecx , dword ptr [eax] ;0x00882cc7 : 8b08 lea edx , dword ptr [ esi + ecx ] ;0x00882cc9 : 8d140e cmp dword ptr [ edx + 48 ] , 00h ;0x00882ccc : 837a3000 je Label882cd8 ;0x00882cd0 : 7406 test byte ptr [ edx + 16 ] , 02h ;0x00882cd2 : f6421002 jne Label882ce3 ;0x00882cd6 : 750b Label882cd8 :: mov eax , dword ptr [eax] ;0x00882cd8 : 8b00 lea edx , dword ptr [ esi + eax ] ;0x00882cda : 8d1406 test byte ptr [ edx + 17 ] , 08h ;0x00882cdd : f6421108 je Label882d56 ;0x00882ce1 : 7473 Label882ce3 :: ; ; ------------------------------------------------- ; VFP 9.0 FIX - SQLSETPROP() FUNCTION ; August 2019 ; ------------------------------------------------- ; CCB ; ; Sometimes the SQLSETPROP(0,"Transactions",1) function causes the error "Connection 0# is busy (Error 1541)". ; ; 2019/8/30, by ccb ; cmp dword ptr [ ebp + 8 ] , 00h je Label882d56 push edi ;0x00882ce3 : 57 xor eax , eax ;0x00882ce4 : 33c0 pushd 03Fh ;0x00882ce6 : 6a3f mov byte ptr [ ebp + 0FFFFFEFCh ] , 00h ;0x00882ce8 : c685fcfeffff00 pop ecx ;0x00882cef : 59 lea edi , dword ptr [ ebp + 0FFFFFEFDh ] ;0x00882cf0 : 8dbdfdfeffff rep stosd ;0x00882cf6 : f3ab mov ecx , dword ptr [ Data93b948 ] ;0x00882cf8 : 8b0d48b99300 mov ecx , dword ptr [ecx] ;0x00882cfe : 8b09 stosw ;0x00882d00 : 66ab mov edx , dword ptr [edx] ;0x00882d02 : 8b12 lea eax , dword ptr [ edx + 2 * edx ] ;0x00882d04 : 8d0452 shl eax , 05h ;0x00882d07 : c1e005 mov eax , dword ptr [ eax + ecx + 56 ] ;0x00882d0a : 8b440838 test eax , eax ;0x00882d0e : 85c0 pop edi ;0x00882d10 : 5f je Label882d27 ;0x00882d11 : 7414 mov ecx , dword ptr [eax] ;0x00882d13 : 8b08 mov edx , 0FFh ;0x00882d15 : baff000000 lea eax , dword ptr [ ebp + 0FFFFFEFCh ] ;0x00882d1a : 8d85fcfeffff call Fun42c33e ;0x00882d20 : e81996baff jmp Label882d3e ;0x00882d25 : eb17 Label882d27 :: push dword ptr [ ebp + 8 ] ;0x00882d27 : ff7508 lea eax , dword ptr [ ebp + 0FFFFFEFCh ] ;0x00882d2a : 8d85fcfeffff pushd offset Data92ac70 ;0x00882d30 : 6870ac9200 push eax ;0x00882d35 : 50 call Fun43089c ;0x00882d36 : e861dbbaff add esp , 0Ch ;0x00882d3b : 83c40c Label882d3e :: and dword ptr [ebx] , 00h ;0x00882d3e : 832300 lea eax , dword ptr [ ebp + 0FFFFFEFCh ] ;0x00882d41 : 8d85fcfeffff call Fun4ba8ba ;0x00882d47 : e86e7bc3ff mov ecx , 021Dh ;0x00882d4c : b91d020000 call Fun544742 ;0x00882d51 : e8ec19ccff Label882d56 :: mov ecx , dword ptr [ ebp - 4 ] ;0x00882d56 : 8b4dfc pop esi ;0x00882d59 : 5e call Fun42bf1d ;0x00882d5a : e8be91baff leave ;0x00882d5f : c9 ret 08h ;0x00882d60 : c20800 4. APPLIES TO: VFP 6.0.8167.0 VFP 6.0.8961.0 (SP5) VFP 7.0.0.9262 VFP 7.0.0.9465 (SP1) VFP 8.0.0.2521 VFP 8.0.0.3117 (SP1) VFP 9.0.0.2412 VFP 9.0.0.3504 (SP1) VFP 9.0.0.4611 (SP2) VFP 9.0.0.5015 (SP2) VFP 9.0.0.5411 (SP2) VFP 9.0.0.5721 (SP2) VFP 9.0.0.5815 (SP2) VFP 9.0.0.6303 (SP2) VFP 9.0.0.6602 (SP2) VFP 9.0.0.7423 (SP2) The bug has been fixed in VFP Advanced. 5. REFERENCE WEBSITES: 1, baiyujia.com: http://www.baiyujia.com 2, microsoft.com: https://social.msdn.microsoft.com/forums/en-US/41f0cff8-202b-4fb5-8d84-7295249c9261/connection-0-is-busy 3, tek-tips.com: https://www.tek-tips.com/viewthread.cfm?qid=1746276 6. OTHER: For reference only, there is no guarantees. Any questions or suggestions, please send me an email at ccb2000@163.com. |