A contract cannot access another contract's storage directly.
Given contracts C1 and C2, C1 can only access the storage of C2 by invoking a method on C2 that returns data from C2's storage.
Since you are writing C2, you can access its storage from C1 and can make progress. A more specific question may help provide a more specific answer about designing your contracts (structs, flattening, copies...).
Related, there are 3 things that a contract can access from another contract: balance, code, code size.
The underlying mechanisms for doing so are the following EVM opcodes, from the Yellow Paper:
BALANCE: Get balance of the given account
EXTCODECOPY: Copy an account’s code to memory.
EXTCODESIZE: Get size of an account’s code.
Per Paul's comment,
address.balance works in Solidity.