+tVFS_Node *FAT_GetNodeFromINode(tVFS_Node *Root, Uint64 Inode)\r
+{\r
+ tFAT_VolInfo *disk = Root->ImplPtr;\r
+ int ents_per_sector = 512 / sizeof(fat_filetable); \r
+ fat_filetable fileinfo[ents_per_sector];\r
+ int sector = 0, i;\r
+ tVFS_Node stub_node;\r
+\r
+ ENTER("pRoot XInode", Root, Inode);\r
+\r
+ stub_node.ImplPtr = disk;\r
+ stub_node.Size = -1;\r
+ stub_node.Inode = Inode >> 32;\r
+\r
+ for( i = 0; ; i ++ )\r
+ {\r
+ if( i == 0 || i == ents_per_sector )\r
+ {\r
+ if(FAT_int_ReadDirSector(&stub_node, sector, fileinfo))\r
+ {\r
+ LOG("ReadDirSector failed");\r
+ LEAVE('n');\r
+ return NULL;\r
+ }\r
+ i = 0;\r
+ sector ++;\r
+ }\r
+ \r
+ // Check for free/end of list\r
+ if(fileinfo[i].name[0] == '\0') break; // End of List marker\r
+ if(fileinfo[i].name[0] == '\xE5') continue; // Free entry\r
+ \r
+ if(fileinfo[i].attrib == ATTR_LFN) continue;\r
+\r
+ LOG("fileinfo[i].cluster = %x %04x", fileinfo[i].clusterHi, fileinfo[i].cluster);\r
+ #if DEBUG\r
+ {\r
+ char tmpName[13];\r
+ FAT_int_ProperFilename(tmpName, fileinfo[i].name);\r
+ LOG("tmpName = '%s'", tmpName);\r
+ }\r
+ #endif\r
+ \r
+ \r
+ if(fileinfo[i].cluster != (Inode & 0xFFFF)) continue;\r
+ if(fileinfo[i].clusterHi != ((Inode >> 16) & 0xFFFF)) continue;\r
+\r
+ LEAVE_RET('p', FAT_int_CreateNode(&stub_node, &fileinfo[i], sector*ents_per_sector+i));\r
+ }\r
+ LOG("sector = %i, i = %i", sector, i);\r
+ LEAVE('n');\r
+ return NULL;\r
+}\r
+\r