Browse Source

{}0x00264518,CFTTFile_Buffered::Writ, bugfix

DESKTOP-AB9OQPJ\RED-10 3 years ago
parent
commit
ec3991c7b9
1 changed files with 112 additions and 4 deletions
  1. 112 4
      jni/CFTTFile_Buffered.cpp

+ 112 - 4
jni/CFTTFile_Buffered.cpp

@@ -25,7 +25,8 @@ void CFTTFile_Buffered::Shutdown() {
 //-------------------------------------------------------------------------------------------------
 //002640F8 //^_^
 bool CFTTFile_Buffered::FillBuffer(int index, int64 end) {
-  return true;
+  LOGE("CFTTFile_Buffered::FillBuffer %p%x%x%x",this,index,((int*)&end)[0],((int*)&end)[1]);
+  return rand();
 }
 //-------------------------------------------------------------------------------------------------
 //00264302 //^_^
@@ -34,9 +35,116 @@ int64 CFTTFile_Buffered::Read(void *arg_buf, int64 len) {
 }
 //-------------------------------------------------------------------------------------------------
 //00264518
-int64 CFTTFile_Buffered::Write(void const *buf, int64 buflen) {
-  int64 dret = 0;
-  return dret;
+int64 CFTTFile_Buffered::Write(void const *buf, int64 buflen_r8sp20) {
+  int64 dret_3C_sp18 = 0;
+  if (pFile_8 == nullptr)
+    return -1;
+
+  // 00264532
+  if ((pFile_8->GetModeFlags() & 3) == 1) {
+    // 00264542
+    errCode_4 = EFTTError_14;
+    Close();
+    return -1;
+  }
+
+  // loc_26454A
+  if (errCode_4) {
+    // loc_264550
+    Close();
+    return -1;
+  }
+
+  // loc_264564
+  if (pFile_8->GetModeFlags() & 4) {
+    // 00264574
+    int64 d = Seek(0, 2);
+    if (d <= -1)
+      return d;
+  }
+
+  // loc_264590
+  uint8 *pbuf_38 = static_cast<uint8 *>(const_cast<void *>(buf));
+
+  // loc_264590
+  int r10 = 0;
+  // int64 var_2C = 0;
+  //  int64 var_3C = 0;
+  while (buflen_r8sp20 > 0) {
+    // loc_2645AA
+    int64 r6r7 = i64Arrar_18[r10];  //.text:002645B2 048   LDRD.W R6, R7, [R0,#0x18] @ R6, R7 = i64Arrar_18[r10]
+    int r4 = r10;
+    r10 = r10 ^ 1;
+    int64 r2r3 = r6r7 + mod_C;
+    if (curPos_38 < r6r7 || curPos_38 >= (r6r7 + mod_C)) {
+      // loc_2645D8
+      if (curPos_38 < i64Arrar_18[r10] || curPos_38 >= (i64Arrar_18[r10] + mod_C)) {
+        // loc_2645FC
+        while (byArray_30[r4]) {
+          if (!byArray_30[r10]) {
+            r4 = r10;
+            break;
+          }
+          // loc_264608
+          FTTThread_Sleep(1);
+        }
+
+        // loc_26461A
+        if (!FillBuffer(r4, curPos_38)) {
+          return -1;
+        }
+      }
+
+      continue;
+    }
+
+    // loc_26462C
+    int64 r5r7_spc = (int64)mod_C - (curPos_38 - r6r7);
+    if (r5r7_spc >= buflen_r8sp20) {
+      r5r7_spc = buflen_r8sp20;
+      //dret_3C_sp18 = buflen;
+    } else {
+      //dret_3C_sp18 = r5r7;
+    }
+
+    // 00264662
+    if ((r6r7 + mod_C) < size_40 && !byArray_30[r10]) {
+      // 00264674
+      if (r2r3 < i64Arrar_18[r10] || r2r3 >= (i64Arrar_18[r10] + mod_C)) {
+        // loc_264696
+        if (!byArray_32[r10]) {
+          // 0026469C
+          if (!FillBuffer(r10, r2r3)) {
+            return -1;
+          }
+        }
+      }
+    }
+
+    // loc_2646A8
+    while (byArray_30[r4]) {
+      // loc_2646B2
+      FTTThread_Sleep(1);
+    }
+
+    // 002646BE
+
+    memcpy(bufArray_28[r4] + (int)(curPos_38 - r6r7), pbuf_38, (int)r5r7_spc);
+
+    byArray_32[r4] = 1;  // 002646D6   STRB.W          R0, [R7,#0x32]
+    pbuf_38 += (int)r5r7_spc;
+    curPos_38 += r5r7_spc;  // 00264706   STRD.W          R0, R1, [R12]
+//curpos_38=r9
+    if (curPos_38 >= size_40) {
+      size_40 = curPos_38;  // 00264706
+    }
+
+    dret_3C_sp18 += r5r7_spc;
+    buflen_r8sp20 -= r5r7_spc;
+   
+  }
+
+  return dret_3C_sp18;
 }
 //-------------------------------------------------------------------------------------------------
 //00264746 //^_^